Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли записывать в папку [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо