![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли записывать в папку [D7]
User © (2010-04-09 19:30:00)Привет.
Знаю, что вопрос избитый, но в интернете не нашел ничего дельного по сабжу.
Ситуация такая: есть ли возможность сохранять файл в указанную папку (а то мало ли - может это папка на DVD-диске или может доступ к ней не разрешен текущему юзеру).
Toombaa Yoombaa (2010-04-10 15:35:00) [1]есть ли возможность сохранять файл в указанную папку (а то мало ли - может это папка на DVD-диске или может доступ к ней не разрешен текущему юзеру).
При попытка записать что-то в папку, VCL сгенерирует исключение, которое будет показано пользователю, из которого пользователь поймет, что он выбран неподходящую папку. То есть, тебе об этом думать не надо.
С другой стороны, если ты не хочешь ничего показывать пользователю, сделай просто что-то наподобие вот этого:
try
Strings.SaveToFile(FileName);
except
on E: Exception do
begin
// Тут, если надо, напиши код, который будет выполняться при возникновении любой ошибки в блоке try...except
// Например, ShowMessage('Не удалось записать данные: ' + E.Message);
// Если надо - можешь кинуть ошибку дальше, чтобы VCL показала ее пользователю, например. Для этого раскомментируй следующую строку:
// raise;
end;
end;
Харакири (2010-04-10 15:28:00) [2]Во народ уже просыпается, но самые злые пока спят
Гав-гав! Гав-гав-гав!!!
oldman (2010-04-10 12:27:00) [3]
> Anatoly Podgoretsky © (10.04.10 12:11) [17]
суббота... лениво...
Anatoly Podgoretsky (2010-04-10 12:11:00) [4]Во народ уже просыпается, но самые злые пока спят.
sniknik (2010-04-10 10:52:00) [5]> что именно случилось, и какого именно файла открытия ошибка, и какая именно ошибка.
а после выясняется, что записывается рейтинг (например) вот так writeln(F, 'ratio=' a/b) и то, что b в некоторых случаях равно 0 (редко но вполне легитимно по логике) ну никак не обрабатывается.
и выясняется это когда уже дойдет до скандала, и исходный код посылают специалисту из другого филиала (туда где возникла проблема) чтобы он "убедился, что там все в порядке"(читай отвязался).
ага как же в порядке. и с чем только не сталкивался, и деление на ноль, и занятый порт, отсутствие файла/занятость/недостаток прав на него, банальное AV и т.д. в общем всего чего угодно но только не того чего написал сам ламер-программист в своем сообщении (или "переводчик" ошибок на "понятный язык". они тоже этим грешат, переведут одну и закроют весь класс...).
Игорь Шевченко (2010-04-10 10:51:00) [6]
> Ты еще благодари, что народ пока спит
народ не спит...он все видит.
_Юрий (2010-04-10 10:24:00) [7]
> User (10.04.10 10:04) [11]
> А что здесь не так?
Здесь не так то, что потом будет трудно понять, что же именно случилось в программе.
Когда пользователь позвонит и скажет, что у него 'Ошибка при создании файла', ты врядли сходу поймешь, что именно случилось, и какого именно файла открытия ошибка, и какая именно ошибка. Особенно если программа открывает больше, чем один файл
Anatoly Podgoretsky (2010-04-10 10:09:00) [8]Ты еще благодари, что народ пока спит, а то бы навалились на тебя бы с оскорблениями, поскольку подобное достало.
Anatoly Podgoretsky (2010-04-10 10:08:00) [9]> User (10.04.2010 10:04:11) [11]
А это "'Ошибка при создании файла", кому оно нужно, нужна причина.
Вот теперь когда ты сказал задачу, можно сразу сказать, что все предыдущие советы были не в тему. Тут надо использовать TIniFile и обработку ошибок. А чем твое сообщение лучше, но я сразу скажу оно хуже и очень, по сути это скрытая диверсия.
User (2010-04-10 10:04:00) [10]
> И никогда не пиши так
А что здесь не так?
> Ты как обычный начинающий ничего не говоришь о задаче, зачем
> тебе нужно
Мне нужно лишь записать INI-файл с настройками программы в папку. И чтобы не возникало всяких ошибок типа "Unable to create file" надо проверить, есть ли доступ к этой папке на запись файлов.
Anatoly Podgoretsky (2010-04-10 09:59:00) [11]
> Не поделитесь этой идеей?
Это и есть идея, не проверять возможность, а просто писать и проверять на ошибку, с исключениями это на автомате.
Anatoly Podgoretsky (2010-04-10 09:50:00) [12]
> А что можно использовать из VCL в данном случае?
Ты как обычный начинающий ничего не говоришь о задаче, зачем тебе нужно, а без этого любой совет может быть бестолковый, но в близайшем приближение - это TFileStream, но этот совет как и CreateFile не узнает о возможности, а просто создает файл. с TFileStream можно задействовать механизм исключений и их обработки, а не мучаться с GetLastError и Handle
И никогда не пиши так
> begin
> ShowMessage('Ошибка при создании файла.');
> Exit;
> end;
Иначе поколения и пользователи тебя проклянут.
User (2010-04-10 09:49:00) [13]
> По другому записать и проверить результат просто, а узнать
> возможно много
Не поделитесь этой идеей?
Anatoly Podgoretsky (2010-04-10 09:46:00) [14]По другому записать и проверить результат просто, а узнать возможно много, много сложнее и вызывает сомнение ценность данной проверки.
User (2010-04-10 09:45:00) [15]
> а нафига ты тогда полез в АПИ
Просто я использовал тот код, который нашел.
> почему не используешь тоже из VCL
А что можно использовать из VCL в данном случае?
Anatoly Podgoretsky (2010-04-10 09:45:00) [16]
> Ситуация такая: есть ли возможность сохранять файл в указанную
> папку
Обычно надо записать, а не узнавать можно или нет. Кроме того эта возможно не ограничена только правами, там может просто элементарно не быть места и возможность сразу улетучится, при наличии прав.
Anatoly Podgoretsky (2010-04-10 09:41:00) [17]
HANDLE CreateFile(
LPCTSTR lpFileName, // pointer to name of the file
DWORD dwDesiredAccess, // access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
DWORD dwCreationDistribution, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to file with attributes to copy
);
И чего не понятно?
Меня тут смущает флаг FILE_FLAG_OVERLAPPED
Ну и еще вопрос, а нафига ты тогда полез в АПИ, почему не используешь тоже из VCL?
User (2010-04-10 09:34:00) [18]
if (CreateFile(PChar(ExtractFilePath(ParamStr(0)) + 'FileName.tmp'),
GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED , 0) = INVALID_HANDLE_VALUE) then
begin
ShowMessage('Ошибка при создании файла.');
Exit;
end;
Нашел это в интернете. Тут наверно ошибка в коде, потому что он всегда выдает INVALID_HANDLE_VALUE (даже если есть доступ к папке на запись).
Не могу разобраться в чем дело - для CreateFile нужно указывать кучу входных параметров, в которых я не разбираюсь. Не подскажете в чем проблема, мастера?
User (2010-04-09 20:33:00) [19]Спасибо за наводку. Буду пытаться.
Игорь Шевченко (2010-04-09 19:40:00) [20]CreateFile + GetLastError