![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Exception при записи файла в недоступную для записи папку
User © (2010-05-29 09:00:00)Какой Exception активируется, если попытаться записать файл в недоступную для записи папку.
Плохиш (2010-05-30 16:51:00) [21]
> except
> on classes.EWriteError do ShowMessage('Some error text')
> else
> end;
>
>
Я бы убил.
Anatoly Podgoretsky (2010-05-30 09:32:00) [22]> бумбум (30.05.2010 07:38:09) [9]
А вопрос то про доступность папки, а не про наличие.
бумбум (2010-05-30 07:38:00) [23]Исходя из задачи непросто ли проверить сушествования пути каталога:
If not DirectoryExists('Z:\') then
ShowMessage('Net papki');
Loginov Dmitry (2010-05-29 22:26:00) [24]
> Я выбрал несуществующий на моем компьютере путь Z:\...,
> чтобы проверить, вызовется ли EWriteError при попытке записи
> или нет.
>
> К сожалению он не вызывается. Что не так в коде?
А почему он должен вызываться? Кто-то это обещал?
Вот выдержка из исходников:
procedure TIniFile.WriteString(const Section, Ident, Value: string);
begin
if not WritePrivateProfileString(PChar(Section), PChar(Ident),
PChar(Value), PChar(FFileName)) then
raise EIniFileException.CreateResFmt(@SIniFileWriteError, [FileName]);
end;
Как видно, причину ошибку тут понять нельзя. Обертка TIniFile весьма несовершенна.
Выяснить причину ошибки позволяет GetLastError.
User (2010-05-29 20:35:00) [25]
> Anatoly Podgoretsky
Да, наверно лучше так.
Anatoly Podgoretsky (2010-05-29 20:32:00) [26]> User (29.05.2010 20:24:05) [5]
except
ShowMessage('Some error text') else
end;
User (2010-05-29 20:24:00) [27]Прошу прощения, оказалось, что и это не то, что мне нужно. Приведу кусок кода:
try
with TIniFile.Create('Z:\Settings.ini') do
try
WriteInteger('Application', 'FormLeft', Form1.Left);
WriteInteger('Application', 'FormTop', Form1.Top);
finally
Free;
end;
except
on classes.EWriteError do ShowMessage('Some error text') else
end;
Я выбрал несуществующий на моем компьютере путь Z:\..., чтобы проверить, вызовется ли EWriteError при попытке записи или нет.
К сожалению он не вызывается. Что не так в коде?
User (2010-05-29 20:16:00) [28]EFCreateError - вот что мне требовалось узнать.
Anatoly Podgoretsky (2010-05-29 10:57:00) [29]> Омлет (29.05.2010 10:45:02) [2]
Так отладчик сразу покажет.
Омлет (2010-05-29 10:45:00) [30]Кем активируется?
constructor TFileStream.Create(const FileName: string; Mode: Word; Rights: Cardinal);
begin
if Mode = fmCreate then
begin
inherited Create(FileCreate(FileName, Rights));
if FHandle < 0 then
raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]);
end
else
begin
inherited Create(FileOpen(FileName, Mode));
if FHandle < 0 then
raise EFOpenError.CreateResFmt(@SFOpenErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]);
end;
end;
_Юрий (2010-05-29 09:34:00) [31]Получение ответа на этот вопрос эмпирическим путем занимает меньше времени, чем публикация вопроса на форуме :-)