Форум: "Начинающим";
Текущий архив: 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.066 c