Страница: 1 | 2 |
Вопрос: Доступен ли файл?!
Добавлено: 12.04.07 02:26
Автор вопроса: Lanback | ICQ: 271-209-305
Подскажите, плиз, как узнать, доступен ли файл!
У меня многопоточное приложение и один из потоков может захотеть записать в файл, когда в него пишет другой поток. Мне нужно как-то проверить - доступен ли файл для чтения и записи! Заранее благодарен!
Ответы
Всего ответов: 18
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #4
Добавлено: 12.04.07 15:53
Очень тупо, вообще-то. Я не знаю, на чем ты пишешь, но в C++ критические секции реализуются примерно так:
// В начале программы
InitializeCriticalSection(&cs);
...
// В конце программы
DeleteCriticalSection(&cs);
// В потоках
EnterCriticalSection(&cs);
... // Операции с файлом
LeaveCriticalSection(&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-сайт:
Профиль | | #9
Добавлено: 12.04.07 19:55
Неделя С++ в каждом вопросе встречаеста С'ішка
Номер ответа: 10
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #10
Добавлено: 12.04.07 19:56
Никто не гарантирует, что присвоение и проверка значения этой переменной будет атомарной операцией. Поэтому нужно использовать функции операционной системы, а не пытаться "проскочить".
Номер ответа: 11
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #11
Добавлено: 12.04.07 19:57
Правильно, фигли. VB6 отмирает, а дотнет не устраивает всех, кому нужно что-то больше, чем гуй к БД
Номер ответа: 12
Автор ответа:
Lanback
ICQ: 271-209-305
Вопросов: 23
Ответов: 48
Профиль | | #12
Добавлено: 13.04.07 11:54
Вышел с этой ситуации след. образом
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???