Проверка возможности записи файла на диск

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Vasia777
Сообщения: 5
Зарегистрирован: 19 дек 2006, 18:13

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

Конструкция
Try
Except end;


в данном случае не работает.

Или может кто-нибудь знает, как можно проверить наличие возможности записать файл?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Конструкция Try Except используется для отлова исключений. Файловые ошибки не являются исключениями - это ошибки ввода/вывода. За состояние произведенной файловой операции отвечает функция IOResult которая выдает код ошибки файловой операции - если таковая была, либо 0 - если все прошло гладко. Однако компилятор по-умолчанию уже генерит код, который ее проверяет и выдает сообщение в случае ошибки. Следовательно, чтобы прога молчала в тряпочку в этом месте генерацию кода необходимо исключить, при необходимости проверять самому IOResult

Код: Выделить всё

AssignFile(F, 'abcdef.dat');
{$I-}
Reset(F, 1);
If IOResult <> 0 then
    begin
    ...
    ...
    end;
{$I+}
Vasia777
Сообщения: 5
Зарегистрирован: 19 дек 2006, 18:13

somewhere, большое спасибо!
Vasia777
Сообщения: 5
Зарегистрирован: 19 дек 2006, 18:13

В общем половина проблемы решена, а это уже хорошо... Только заместо Reset пришлось поставить ReWrite.. Чтоб создать файл, а не открывать существующий для чтения.

Таким способом можно проверить создался ли файл или нет, а вот избежать сообщения "диск защищен от записи" не удалось, т.к. при вызове функции ReWrite сразу же выдаётся ошибка ввода/вывода. Что делать не знаю...


Вот код, сообщение выдаётся уже после ошибки ввода/вывода. Кто знает, подскажите пожалуйста!!!!

var
f:file;
begin
AssignFile(F, 'h:\abcdef.dat');
{$I-}
Rewrite(F, 1);
If IOResult <> 0 then
begin
showmessage('Ошибка');
end;
{$I+}
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

{$!-}
Rewrite(F, 1);
{$I+}
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

Здесь всё правильно и должно безотказно работать, - не знаю в чём ошибка. Сообщение итак должно выдаваться после ошибки ввода/вывода. (по-моему)
Vasia777
Сообщения: 5
Зарегистрирован: 19 дек 2006, 18:13

Я знаю, что должно. А как сделать так, чтоб когда возникла ошибка ввода вывода, пользователь не видел сообщения типа: "Диск защищён от записи (итп)"?? Или как проверить возможность создания файла на диске, чтоб не вылазили ни какие сообщения??
Back to back!!!
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

вот пример без вылетания ошибки немного подправь будет тебе счастье

Код: Выделить всё

function IsDriveReady(DriveLetter: char): bool;
var
  OldErrorMode: Word;
  OldDirectory: string;
begin
  OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
  GetDir(0, OldDirectory);
  {$I-}
  ChDir(DriveLetter + ':\');
  {$I+}
  if IoResult <> 0 then
    Result := False
  else
    Result := True;

  ChDir(OldDirectory);
  SetErrorMode(OldErrorMode);
end;

затем используем её: 

if not IsDriveReady('A') then
  ShowMessage('Drive Not Ready')
else
  ShowMessage('Drive is Ready');
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

&quot писал(а): избежать сообщения "диск защищен от записи" не удалось
под отладчиком? или запустив EXE?
Изображение
Ответить