Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Примерный ученик от Август 22, 2012, 09:29



Название: Занят ли файл???
Отправлено: Примерный ученик от Август 22, 2012, 09:29
Как узнать, занят ли файл каким либо процессом или к нему в данный момент никто не обращается (он закрыт). ???


Название: Re: Занят ли файл???
Отправлено: Пантер от Август 22, 2012, 09:35
Под виндой можно его попытаться удалить. :)


Название: Re: Занят ли файл???
Отправлено: Примерный ученик от Август 22, 2012, 09:40
Мне надо и под виндой и под линуксом точно знать: свободен или нет.
Под виндой открытый файл, который редактировался в блокноте, программа удалила нафиг >:(


Название: Re: Занят ли файл???
Отправлено: maint от Август 22, 2012, 09:46
из простых способов, попробовать его открыть в эксклюзивном режиме. Иначе берем для линуха lsof, смотрим исходники. Под винду то же где то видел утилитку с исходниками, не вспомню правда где


Название: Re: Занят ли файл???
Отправлено: Примерный ученик от Август 22, 2012, 09:52
из простых способов, попробовать его открыть в эксклюзивном режиме. Иначе берем для линуха lsof, смотрим исходники. Под винду то же где то видел утилитку с исходниками, не вспомню правда где
В эксклюзивном это как?


Название: Re: Занят ли файл???
Отправлено: Bepec от Август 22, 2012, 10:09
Пытаемся открыть, получаем код ошибки. Смотрим в соответствии с OS.

PS ну или если совсем уж эксклюзивный вариант - написать платформозависимую функцию получения блокирующих дескрипторов :) Правда неуверен, что в linux они есть :D


Название: Re: Занят ли файл???
Отправлено: xokc от Август 22, 2012, 10:12
В эксклюзивном это как?
В Windows это с использованием флага OF_SHARE_DENY_NONE в функции OpenFile.

Под виндой открытый файл, который редактировался в блокноте, программа удалила нафиг >:(
В общем случае задача не имеет простого решения. Не буду говорить про блокнот - его логика работы с файлами мне не ведома. Но могу себе представить такое: программа открыла файл, считала его в память, закрыла. Пользователь в программе данные поизменял, нажал save - программа файл снова открыла, внесла изменения - закрыла. В промежутках между этими двумя моментами файл для ОС - совершенно свободен.


Название: Re: Занят ли файл???
Отправлено: Igors от Август 22, 2012, 10:26
В общем случае задача не имеет простого решения. Не буду говорить про блокнот - его логика работы с файлами мне не ведома. Но могу себе представить такое: программа открыла файл, считала его в память, закрыла. Пользователь в программе данные поизменял, нажал save - программа файл снова открыла, внесла изменения - закрыла. В промежутках между этими двумя моментами файл для ОС - совершенно свободен.
Ну так делают многие (Photoshop, TextEdit и др), но они никогда не сохранят без пользователя, он должен нажать Save (As), Так что это нормально

А почему не попытаться открыть по чтению И записи? Файл не меняется, а если кто-то др открыл по записи - ошибка. А если этот другой как-то хитро открыл - то его проблемы. Чем не простое решение?


Название: Re: Занят ли файл???
Отправлено: Примерный ученик от Август 22, 2012, 10:49
Остановился на
Код:
        QFile fl(qApp->applicationDirPath()+"/test.txt");
        QDir wokerDirU(qApp->applicationDirPath());
bool free=wokerDirU.rename(fl.name(),fl.name());
if (free)// файл не занят
       {
       }
Если файл используется - переименовывать не дает.
Работает и в винде и по линуксом.


Название: Re: Занят ли файл???
Отправлено: Пантер от Август 22, 2012, 10:51
Это с каких пор нельзя переименовывать открытый файл? Даже винда позволяет это делать. А вот переименование себя в себя и должно фэйлиться.


Название: Re: Занят ли файл???
Отправлено: Bepec от Август 22, 2012, 10:56
Насколько я знаю - переименовывается спокойно :) Вот только что переименовал :D
И никаких репрессий со стороны системы :)


Название: Re: Занят ли файл???
Отправлено: Примерный ученик от Август 22, 2012, 11:02
Мне важно, что бы не было операций записи в файл.
Когда в файл идет запись - не дает переименовывать.
Проверьте и убедитесь.
Не точно сформулировал постановку задачи >:(


Название: Re: Занят ли файл???
Отправлено: Пантер от Август 22, 2012, 11:08
Код:
>>>$cat /dev/random > /var/tmp/1&
>>>$ls /var/tmp/
/var/tmp/1
>>>$mv /var/tmp/1 /var/tmp/2
>>>$ls /var/tmp/
/var/tmp/2

Одна черепашка врет...


Название: Re: Занят ли файл???
Отправлено: Странник от Август 22, 2012, 11:16
открывайте файл в монопольном режиме и не выпендривайтесь. для примера: Блокнот шарит, WordPad монополит.


Название: Re: Занят ли файл???
Отправлено: Примерный ученик от Август 24, 2012, 20:16
А как указать монопольный режим?
В QFile ничего подобного не нашел


Название: Re: Занят ли файл???
Отправлено: Igors от Август 24, 2012, 20:23
А как указать монопольный режим?
В QFile ничего подобного не нашел
По-моему он по умолчанию и есть монопольный если открывать read+write. Знатоки поправят если не так  :)