Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.113 c
15-1265387354
Jeer
2010-02-05 19:29
2010.08.27
arduino + clone


2-1270565783
Buzzik
2010-04-06 18:56
2010.08.27
Проблема с потоками


11-1216886396
rainstuff
2008-07-24 11:59
2010.08.27
Отключение дисплея


2-1273738553
timekiller
2010-05-13 12:15
2010.08.27
Общение между программами по локальной сети


15-1271190602
Юрий
2010-04-14 00:30
2010.08.27
С днем рождения ! 14 апреля 2010 среда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский