2013-07-26 8 views
0

Мне нужно проверить, используется ли файл, прежде чем я попытаюсь получить к нему доступ. Есть ли способ сделать это в среде Lazarus?Lazarus: Как проверить, используется ли файл?

+0

'попробовать ... except' конструкция не является достаточно хорошим для вас? –

ответ

2

Открыть файл с FileOpen(FileName, fmOpenReadWrite or fmShareExclusive) и проверить результат.

Обновление (спасибо комментатору Кена Уайта). Это не прямой ответ на ваш вопрос как FileOpen Фактически получает доступ к файлу, но вы не должны выполнять проверку, а затем открывать файл, иначе вы получите условие гонки. Вы должны открыть файл, а затем проверить, удалось ли открыть.

Открытие файла с FileOpen и доступ к файлу через его ручку может показаться незнакомым. Вы можете достичь той же цели при открытии файла, например. Rewrite внутри a try-except блок. Я не уверен в Lazarus, но в Delphi с использованием try-except с высокоуровневыми файловыми процедурами требуется явный сброс IOResult в случае исключения (поместите SetInOutRes(0) в раздел except), в противном случае следующая операция файла завершится с ошибкой.

+0

Конечно. Я должен добавить к своему ответу, что тест должен выполняться одновременно с получением доступа, иначе будет состояние гонки. Есть и другие способы открыть файл внутри блока try-except. Использование 'FileOpen' просто предоставляет исключение для выполнения проверки. – Inspired

+0

+1. Намного лучше. :-) –

1

У вас нет. Вы пытаетесь открыть его и обрабатывать исключение, если и когда вы не можете.

Проверка того, что он используется, в первую очередь не имеет никакой цели.

Your code to see if it's in use says it's not 
--->>> Another app opens the file, locking it 
Your code to open file fails 

Вместо этого используйте обычный try..except блок:

try 
    FS := TFileStream.Create(YourFileName, fmOpenReadWrite, fmShareExclusive); 
    // Code to use file here 
except 
    // Handle failure to access file 
end; 
+0

Или используйте $ I +/I- и проверьте ioresult, если ваш I/O не основан на потоке. –

Смежные вопросы