LINUX.ORG.RU

Запись на сетевую шару, узнать что она доступна

 ,


0

1

Добрый день, нужно записать файл в папку на samba, но если вдруг демон самбы отвалился то все равно QFile ф-ия open возвращает, что открытие файла удалось. Как узнать что запись невозможна?


Ответ на: комментарий от Noob_Linux

Кроме как попробовать записать тестовый файл не вижу вариантов.

например попробовать изменить [amc]time у файла.

gagarin0
()
Последнее исправление: gagarin0 (всего исправлений: 1)
Ответ на: комментарий от da17

Вы же файл создаёте, почему каталог пустой? И, в целом, смысл в этих проверках? Отвалится же может в любой момент, хоть между create() и write(), хоть во время write().

mky ★★★★★
()
Ответ на: комментарий от da17

При попытке записи write да, я получаю ошибку, а как нибудь можно до попытки записи это проверить?

Создать скрытый файл и сразу удалить, если запись запрещена, то он не создастся, а если всё нормально, то скорее всего успеешь удалить. В крайнем случае, останется мусорный пустой скрытый файл, если отвалится между созданием и удалением. Но вероятность такого, думаю не очень велика. Хотя, на шаре может быть разрешено создание, но запрещено удаление, вроде так можно настроить. Тогда будет некрасиво, да.

А вообще, на SO сходу советуют

QFileInfo my_dir(folderName);

if(my_dir.isDir() && my_dir.isWritable()){
    // Do something
}

И там же проблема описана, если нужна работа под вендой

Platform Specific Issues File permissions are handled differently on Linux/Mac OS X and Windows. In a non writable directory on Linux, files cannot be created. This is not always the case on Windows, where, for instance, the 'My Documents' directory usually is not writable, but it is still possible to create files in it.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 3)

Как узнать что запись невозможна?

Проверять результат функций. Например:

$ man open
...
RETURN VALUE
    On success, open() <...> return the new file descriptor (a nonnegative integer). 
    On error, -1 is returned and errno is set to indicate the error.
...

То же самое касается write:

$ man 2 write
...
RETURN VALUE
    On success, the number of bytes written is returned.
    On error, -1 is returned, and errno is set to indicate the error.
...

И даже close:

$ man close
...
RETURN VALUE
   `close()` returns zero on success.
   On error, -1 is returned, and errno is set to indicate the error.
...

Если ты пользуешся функциями из стандартной сишной библиотеки, то принципиально ничего не меняется:

$ man fopen
...
RETURN VALUE
    Upon successful completion fopen() <...> return a FILE pointer.
    Otherwise, NULL is returned and errno is set to indicate the error.
...

$man 3 printf
...
RETURN VALUE
...
    If an output error is encountered, a negative value is returned.
...

$ man fclose
...
RETURN VALUE
    Upon successful completion, 0 is returned.  Otherwise, EOF is returned and errno is set to indicate the error.
...

Независимо от того, куда ты пишешь, надо открывать файл, писать, закрывать, проверяя результат выполнения каждой операции. Особо отмечу, что если ты пользуешься функциями из сишной библиотеки, то результат printf тоже надо проверять. А если ты выводишь на stdout, то в конце программы закрывать stdout и проверять — а хорошо ли он закрылся?

Заранее проверять возможность записи не только бесполезно (за время между проверкой и собственно действием обстоятельства могут измениться: шара отвалится, файл будет удалён, место закончится и т. д.), но и вредно, поскольку это лишняя и бессмысленная работа.

debugger ★★★★★
()