Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Можно ли записывать в папку   Найти похожие ветки 

 
User   (2010-04-09 19:30) [0]

Привет.

Знаю, что вопрос избитый, но в интернете не нашел ничего дельного по сабжу.

Ситуация такая: есть ли возможность сохранять файл в указанную папку (а то мало ли - может это папка на DVD-диске или может доступ к ней не разрешен текущему юзеру).


 
Игорь Шевченко ©   (2010-04-09 19:40) [1]

CreateFile + GetLastError


 
User   (2010-04-09 20:33) [2]

Спасибо за наводку. Буду пытаться.


 
User   (2010-04-10 09:34) [3]

 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 нужно указывать кучу входных параметров, в которых я не разбираюсь. Не подскажете в чем проблема, мастера?


 
Anatoly Podgoretsky ©   (2010-04-10 09:41) [4]

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?


 
Anatoly Podgoretsky ©   (2010-04-10 09:45) [5]


> Ситуация такая: есть ли возможность сохранять файл в указанную
> папку

Обычно надо записать, а не узнавать можно или нет. Кроме того эта возможно не ограничена только правами, там может просто элементарно не быть места и возможность сразу улетучится, при наличии прав.


 
User   (2010-04-10 09:45) [6]


> а нафига ты тогда полез в АПИ

Просто я использовал тот код, который нашел.
> почему не используешь тоже из VCL

А что можно использовать из VCL в данном случае?


 
Anatoly Podgoretsky ©   (2010-04-10 09:46) [7]

По другому записать и проверить результат просто, а узнать возможно много, много сложнее и вызывает сомнение ценность данной проверки.


 
User   (2010-04-10 09:49) [8]


> По другому записать и проверить результат просто, а узнать
> возможно много

Не поделитесь этой идеей?


 
Anatoly Podgoretsky ©   (2010-04-10 09:50) [9]


> А что можно использовать из VCL в данном случае?

Ты как обычный начинающий ничего не говоришь о задаче, зачем тебе нужно, а без этого любой совет может быть бестолковый, но в близайшем приближение - это TFileStream, но этот совет как и CreateFile не узнает о возможности, а просто создает файл. с TFileStream можно задействовать механизм исключений и их обработки, а не мучаться с GetLastError и Handle
И никогда не пиши так

>  begin
>    ShowMessage("Ошибка при создании файла.");
>    Exit;
>  end;

Иначе поколения и пользователи тебя проклянут.


 
Anatoly Podgoretsky ©   (2010-04-10 09:59) [10]


> Не поделитесь этой идеей?

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


 
User   (2010-04-10 10:04) [11]


> И никогда не пиши так

А что здесь не так?

> Ты как обычный начинающий ничего не говоришь о задаче, зачем
> тебе нужно

Мне нужно лишь записать INI-файл с настройками программы в папку. И чтобы не возникало всяких ошибок типа "Unable to create file" надо проверить, есть ли доступ к этой папке на запись файлов.


 
Anatoly Podgoretsky ©   (2010-04-10 10:08) [12]

> User  (10.04.2010 10:04:11)  [11]

А это ""Ошибка при создании файла", кому оно нужно, нужна причина.

Вот теперь когда ты сказал задачу, можно сразу сказать, что все предыдущие советы были не в тему. Тут надо использовать TIniFile и обработку ошибок. А чем твое сообщение лучше, но я сразу скажу оно хуже и очень, по сути это скрытая диверсия.


 
Anatoly Podgoretsky ©   (2010-04-10 10:09) [13]

Ты еще благодари, что народ пока спит, а то бы навалились на тебя бы с оскорблениями, поскольку подобное достало.


 
_Юрий ©   (2010-04-10 10:24) [14]


> User   (10.04.10 10:04) [11]


> А что здесь не так?


Здесь не так то, что потом будет трудно понять, что же именно случилось в программе.
Когда пользователь позвонит и скажет, что у него "Ошибка при создании файла", ты врядли сходу поймешь, что именно случилось, и какого именно файла открытия ошибка, и какая именно ошибка. Особенно если программа открывает больше, чем один файл


 
Игорь Шевченко ©   (2010-04-10 10:51) [15]


> Ты еще благодари, что народ пока спит


народ не спит...он все видит.


 
sniknik ©   (2010-04-10 10:52) [16]

> что именно случилось, и какого именно файла открытия ошибка, и какая именно ошибка.
а после выясняется, что записывается рейтинг (например) вот так writeln(F, "ratio=" a/b) и то, что b в некоторых случаях равно 0 (редко но вполне легитимно по логике) ну никак не обрабатывается.

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


 
Anatoly Podgoretsky ©   (2010-04-10 12:11) [17]

Во народ уже просыпается, но самые злые пока спят.


 
oldman ©   (2010-04-10 12:27) [18]


> Anatoly Podgoretsky ©   (10.04.10 12:11) [17]


суббота... лениво...


 
Харакири   (2010-04-10 15:28) [19]

Во народ уже просыпается, но самые злые пока спят

Гав-гав! Гав-гав-гав!!!


 
Toombaa Yoombaa   (2010-04-10 15:35) [20]

есть ли возможность сохранять файл в указанную папку (а то мало ли - может это папка на DVD-диске или может доступ к ней не разрешен текущему юзеру).

При попытка записать что-то в папку, VCL сгенерирует исключение, которое будет показано пользователю, из которого пользователь поймет, что он выбран неподходящую папку. То есть, тебе об этом думать не надо.

С другой стороны, если ты не хочешь ничего показывать пользователю, сделай просто что-то наподобие вот этого:

try
 Strings.SaveToFile(FileName);
except
 on E: Exception do
 begin
   // Тут, если надо, напиши код, который будет выполняться при возникновении любой ошибки в блоке try...except
   // Например, ShowMessage("Не удалось записать данные: " + E.Message);
   // Если надо - можешь кинуть ошибку дальше, чтобы VCL показала ее пользователю, например. Для этого раскомментируй следующую строку:
   // raise;
 end;
end;



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.054 c
15-1271450855
Kerk
2010-04-17 00:47
2010.08.27
Что делать, чтобы кровать не скользила по паркету?


15-1274364250
Sergey Masloff
2010-05-20 18:04
2010.08.27
Работа с RFID метками. Пробовал кто?


2-1271248525
De:Light
2010-04-14 16:35
2010.08.27
Загрузка и анализ


2-1267590008
cwl
2010-03-03 07:20
2010.08.27
адрес - property с индексом


15-1264089920
DROWSY
2010-01-21 19:05
2010.08.27
Как можно убрать рекламные окошки, например ,здесь: