Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Доступен ли файл?! Добавлено: 12.04.07 02:26  

Автор вопроса:  Lanback | ICQ: 271-209-305 
Подскажите, плиз, как узнать, доступен ли файл!
У меня многопоточное приложение и один из потоков может захотеть записать в файл, когда в него пишет другой поток. Мне нужно как-то проверить - доступен ли файл для чтения и записи! Заранее благодарен!

Ответить

  Ответы Всего ответов: 18  

Номер ответа: 1
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 12.04.07 02:39
Лочь файл при чтении и записи, например, критическими секциями. Или устанавливай мутекс во время операций ввода/вывода

Ответить

Номер ответа: 2
Автор ответа:
 Lanback



ICQ: 271-209-305 

Вопросов: 23
Ответов: 48
 Профиль | | #2 Добавлено: 12.04.07 13:09
Не мог бы ты объяснить более подробно?!
Я вот как решил сделать: открываю файл для чтения, если при этом возникает ошибка, то останавливаю процесс на 100 мс, и так пока откроется без ошибки.
Как вам такая мысль, не очень ли тупо?!

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 12.04.07 15:47
Нет, поботай синхронизацию потоков лучше...
т.е. если поток занял файл, пусть через механизмы синхронизации потоков (тот же мютекс), где-то поставит флаг что файл занят, а тот поток который обращается к файлу, проверяет этот флаг, если всё ок читает, иначе чё-то там ещё делает...

Ответить

Номер ответа: 4
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #4
Добавлено: 12.04.07 15:53
Очень тупо, вообще-то. Я не знаю, на чем ты пишешь, но в C++ критические секции реализуются примерно так:
CRITICAL_SECTION cs;

// В начале программы
InitializeCriticalSection(&cs);
...
// В конце программы
DeleteCriticalSection(&cs);

// В потоках
EnterCriticalSection(&cs);
... // Операции с файлом
LeaveCriticalSection(&cs);


Вот эта пара гарантирует, что выполнение операций с файлом в разных потоках никогда не будет происходить одновременно:
EnterCriticalSection(&cs);
... // Операции с файлом
LeaveCriticalSection(&cs);

Ответить

Номер ответа: 5
Автор ответа:
 Lanback



ICQ: 271-209-305 

Вопросов: 23
Ответов: 48
 Профиль | | #5 Добавлено: 12.04.07 16:03
Я пишу в VB.NET 2005. Ну есть там, например synclock и end synclock. Надо будет попробовать.
А как с mutex работать никто не подскажет?!
Ну когда мои два потока - хорошо. А что, если пользователь копирует файл с диска d:\ на диск c:\(за которым я и слежу), происходит событие создания файла, но прочитать с этого файла я пока ничего не могу, так как он не до конца скопировался. Как в таком случае узнать, доступен ли файл для чтения?!

Ответить

Номер ответа: 6
Автор ответа:
 Lanback



ICQ: 271-209-305 

Вопросов: 23
Ответов: 48
 Профиль | | #6 Добавлено: 12.04.07 16:04
Т.е. как узнать когда файл будет скопирован полностью...

Ответить

Номер ответа: 7
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #7 Добавлено: 12.04.07 19:34
Ой, опять вы все усложняете.. кошмар ;)
Все проще! если приложение, как я понял, целиком твое, то если файл открыт, дай переменной blnFileOpened значение True..

Ответить

Номер ответа: 8
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #8 Добавлено: 12.04.07 19:44
AgentFire, ну вот опять ты... Ну зачем? Ну незнаешь - не лезь.

Ответить

Номер ответа: 9
Автор ответа:
 D o c a l



ICQ: 408802757 

Вопросов: 76
Ответов: 985
 Web-сайт: www.doc-source.pp.net.ua/
 Профиль | | #9
Добавлено: 12.04.07 19:55
C++

Неделя С++ в каждом вопросе встречаеста С'ішка

Ответить

Номер ответа: 10
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #10
Добавлено: 12.04.07 19:56
Никто не гарантирует, что присвоение и проверка значения этой переменной будет атомарной операцией. Поэтому нужно использовать функции операционной системы, а не пытаться "проскочить".

Ответить

Номер ответа: 11
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #11
Добавлено: 12.04.07 19:57
Правильно, фигли. VB6 отмирает, а дотнет не устраивает всех, кому нужно что-то больше, чем гуй к БД

Ответить

Номер ответа: 12
Автор ответа:
 Lanback



ICQ: 271-209-305 

Вопросов: 23
Ответов: 48
 Профиль | | #12 Добавлено: 13.04.07 11:54
Вышел с этой ситуации след. образом
Dim fs As New FileStream(My.Computer.FileSystem.CombinePath(Application.StartupPath, strLogName), FileMode.Append, FileAccess.Write, FileShare.Write)
        Dim sw As New StreamWriter(fs, System.Text.Encoding.Default)

        SyncLock sw

            sw.WriteLine(strWrite)

            sw.Close()
            fs.Close()
        End SyncLock


Но это в случае когда моё приложение обращается к файлу в нескольких потоках! Но как узнать со своего приложения, доступен ли файл для чтения(вдруг он копируется в тот момент, когда мне нужно считать с него данные)???

Ответить

Номер ответа: 13
Автор ответа:
 Черный ворон



Разработчик

ICQ: 342881585 

Вопросов: 32
Ответов: 256
 Профиль | | #13 Добавлено: 13.04.07 12:00
вдруг он копируется в тот момент, когда мне нужно считать с него данные

В винде можно копировать и читать данные одновременно

Ответить

Номер ответа: 14
Автор ответа:
 Lanback



ICQ: 271-209-305 

Вопросов: 23
Ответов: 48
 Профиль | | #14 Добавлено: 13.04.07 14:19
В винде можно копировать и читать данные одновременно

Всё бы хорошо, но когда копируется какой то файл c:\aaa.txt на d:\aaa.txt, то при обращении к d:\aaa.txt до завершения его копирования, выдаёт ошибку, что файл используется другим процессом...Что делать?!

Ответить

Номер ответа: 15
Автор ответа:
 Lanback



ICQ: 271-209-305 

Вопросов: 23
Ответов: 48
 Профиль | | #15 Добавлено: 13.04.07 14:21
Как в таком случае узнать что файл с:\aaa.txt полностью скопирован в d:\aaa.txt???

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам