Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизКопирование файлов Найти похожие ветки
← →
AlexeyV (2004-04-18 20:16) [0]Стал делать одну програмку, которая должна переименовывать группы файлов. Для переименования исполизую функцию CopyFile из модуля Windows (пробовал так-же функцию MoveFile). Так вот, дело в том что копирование происходит не всегда, хотя имена файлов не содержат ни каких недопустимых символов. Кто знает в чём дело. и как с этим бороться, подскажите пожалуйста. Буду очень благодарен.
← →
AlexeyV (2004-04-18 20:16) [0]Стал делать одну програмку, которая должна переименовывать группы файлов. Для переименования исполизую функцию CopyFile из модуля Windows (пробовал так-же функцию MoveFile). Так вот, дело в том что копирование происходит не всегда, хотя имена файлов не содержат ни каких недопустимых символов. Кто знает в чём дело. и как с этим бороться, подскажите пожалуйста. Буду очень благодарен.
← →
Cardinal © (2004-04-18 22:12) [1]Может быть, возникают какие-либо ошибки. Смотрите
возвращаемый функцией результат. Если он "false", то
уточните код ошибки функцией GetLastError.
← →
Cardinal © (2004-04-18 22:12) [1]Может быть, возникают какие-либо ошибки. Смотрите
возвращаемый функцией результат. Если он "false", то
уточните код ошибки функцией GetLastError.
← →
Yanis © (2004-04-18 22:40) [2]
type
TFileAttr = (ftReadOnly, ftHidden, ftSystem, ftVolumeID, ftDirectory, ftArchive, ftNormal);
← →
Yanis © (2004-04-18 22:40) [2]
type
TFileAttr = (ftReadOnly, ftHidden, ftSystem, ftVolumeID, ftDirectory, ftArchive, ftNormal);
← →
Никита © (2004-04-19 08:18) [3]Вообще-то переименовывать файлы призвана функция Rename
← →
Никита © (2004-04-19 08:18) [3]Вообще-то переименовывать файлы призвана функция Rename
← →
Anatoly Podgoretsky © (2004-04-19 09:05) [4]Rename частый случай MoveFile
← →
Anatoly Podgoretsky © (2004-04-19 09:05) [4]Rename частый случай MoveFile
← →
Alexeyv (2004-04-19 17:35) [5]C атрибутами у меня всё в порядке, функция GetLastEror возвращает значение 5 что бы это могло значить?
← →
Alexeyv (2004-04-19 17:35) [5]C атрибутами у меня всё в порядке, функция GetLastEror возвращает значение 5 что бы это могло значить?
← →
WebErr © (2004-04-19 17:38) [6]В отсутствие медиумов, воспользуйтесь:
FormatMessage(...GetLastError...) + F1
← →
WebErr © (2004-04-19 17:38) [6]В отсутствие медиумов, воспользуйтесь:
FormatMessage(...GetLastError...) + F1
← →
Григорьев Антон (2004-04-19 17:51) [7]5 - это Access Denied.
MSDN Forever.
← →
Григорьев Антон (2004-04-19 17:51) [7]5 - это Access Denied.
MSDN Forever.
← →
VMcL © (2004-04-19 18:16) [8]>>Григорьев Антон (19.04.04 17:51) [7]
Windows.pas тоже не лыком шит :)
{ Access is denied. }
ERROR_ACCESS_DENIED = 5;
← →
VMcL © (2004-04-19 18:16) [8]>>Григорьев Антон (19.04.04 17:51) [7]
Windows.pas тоже не лыком шит :)
{ Access is denied. }
ERROR_ACCESS_DENIED = 5;
← →
AlexeyV (2004-04-20 20:57) [9]Тогда посоветуйте пожалуйста, как же мне всётаки скопировать эти файлы, и что может вызывать эту ошибку?
← →
AlexeyV (2004-04-20 20:57) [9]Тогда посоветуйте пожалуйста, как же мне всётаки скопировать эти файлы, и что может вызывать эту ошибку?
← →
Григорьев Антон (2004-04-21 09:33) [10]Не даёт система вам права работать с этими файлами. Может, они в этот момент ещё кем-то используются, может, прав не хватает, а может, это системный файл, с которым никому, кроме самой системы, ничего делать нельзя.
← →
Григорьев Антон (2004-04-21 09:33) [10]Не даёт система вам права работать с этими файлами. Может, они в этот момент ещё кем-то используются, может, прав не хватает, а может, это системный файл, с которым никому, кроме самой системы, ничего делать нельзя.
← →
Андрей Сенченко © (2004-04-21 11:50) [11]1. Вообще-то пытаться скопировать файл, не проверив предварительно что он никем не занят - некорректно. Может возникнуть сиуация, что в этот файл кто-то что-то пишет, а Вы его копируете. Что получится в результате - сказать не сможет никто.
2. Пытаться удалить файл не проверив его на доступность - тем более. А уж проверять результат удаления - просто необходимо.
Мне в свое время для автоапдэйта своих программок с общего сервера пришлось написать вот такой код:
( не претендую на исключительную корректность и красивость с точки зрения программирования )If FindFirst (NewSoftLoc+"*.*",faAnyFile,InstFile) = 0
then
repeat
If (InstFile.Name = ".") or (InstFile.Name = "..")
then continue;
If ExtractFileExt(InstFile.Name) = ".ini"
then
begin
// здесь мы апдейтим INI-шки
// вырезано автором.
end
else
begin
// здесь мы апдейтим все кроме INI-шек
If FindFirst(ExtractFilePath(paramstr(0))+InstFile.Name,faAnyFile,TempFile) = 0
then
begin
// если на локалке есть такой файл
if TempFile.Time < InstFile.Time
then
begin
// если локалке cтарая версия
If CheckFileFree(ExtractFilePath(paramstr(0))+TempFile.Name) = true
then
begin
// старый файл свободен
If copyFile(pchar(NewSoftLoc+InstFile.Name),pchar(ExtractFilePath(paramstr(0))+TempFile.Name),false)
then
begin
// обновление склалось
memo1.Lines.Add("Установлен файл "+InstFile.Name + " " + DateTimeToStr(FileDateToDateTime(InstFile.Time)));
end
else
begin
// файл НЕ скопирован
memo1.Lines.Add("Ошибка копирования "+TempFile.Name + " " + DateTimeToStr(FileDateToDateTime(TempFile.Time)));
InstOK := false;
end
end
else
begin
// старый файл занят
sleep(5000);
If CheckFileFree(ExtractFilePath(paramstr(0))+TempFile.Name) = true
then
begin
// старый файл освободился
If copyFile(pchar(NewSoftLoc+InstFile.Name),pchar(ExtractFilePath(paramstr(0))+TempFile.Name),false)
then
begin
// обновление склалось
memo1.Lines.Add("Установлен файл "+InstFile.Name + " " + DateTimeToStr(FileDateToDateTime(InstFile.Time)));
end
else
begin
// файл НЕ скопирован
memo1.Lines.Add("Ошибка копирования "+TempFile.Name + " " + DateTimeToStr(FileDateToDateTime(TempFile.Time)));
InstOK := false;
end
end
else
begin
memo1.Lines.Add("Файл недоступен "+TempFile.Name + " " + DateTimeToStr(FileDateToDateTime(TempFile.Time)));
InstOK := false;
end;
end;
end
else
begin
// версия на локалке совпадает
memo1.Lines.Add("Версия совпадает " + TempFile.Name + " " + DateTimeToStr(FileDateToDateTime(TempFile.Time)));
end;
end
else
begin
// если на локалке нет такого файла
if CopyFile(pchar(NewSoftLoc+InstFile.Name),pchar(ExtractFilePath(paramstr(0))+ InstFile.Name),false)
then
begin
// скоприровано успешно
memo1.Lines.Add("Установлен файл "+InstFile.Name + " " + DateTimeToStr(FileDateToDateTime(InstFile.Time)));
end
else
begin
// ошибки копирования
memo1.Lines.Add("Ошибка установки "+InstFile.Name + " " + DateTimeToStr(FileDateToDateTime(InstFile.Time)));
InstOK := false;
end;
end;
FindClose(TempFile);
end
← →
Андрей Сенченко © (2004-04-21 11:50) [11]1. Вообще-то пытаться скопировать файл, не проверив предварительно что он никем не занят - некорректно. Может возникнуть сиуация, что в этот файл кто-то что-то пишет, а Вы его копируете. Что получится в результате - сказать не сможет никто.
2. Пытаться удалить файл не проверив его на доступность - тем более. А уж проверять результат удаления - просто необходимо.
Мне в свое время для автоапдэйта своих программок с общего сервера пришлось написать вот такой код:
( не претендую на исключительную корректность и красивость с точки зрения программирования )If FindFirst (NewSoftLoc+"*.*",faAnyFile,InstFile) = 0
then
repeat
If (InstFile.Name = ".") or (InstFile.Name = "..")
then continue;
If ExtractFileExt(InstFile.Name) = ".ini"
then
begin
// здесь мы апдейтим INI-шки
// вырезано автором.
end
else
begin
// здесь мы апдейтим все кроме INI-шек
If FindFirst(ExtractFilePath(paramstr(0))+InstFile.Name,faAnyFile,TempFile) = 0
then
begin
// если на локалке есть такой файл
if TempFile.Time < InstFile.Time
then
begin
// если локалке cтарая версия
If CheckFileFree(ExtractFilePath(paramstr(0))+TempFile.Name) = true
then
begin
// старый файл свободен
If copyFile(pchar(NewSoftLoc+InstFile.Name),pchar(ExtractFilePath(paramstr(0))+TempFile.Name),false)
then
begin
// обновление склалось
memo1.Lines.Add("Установлен файл "+InstFile.Name + " " + DateTimeToStr(FileDateToDateTime(InstFile.Time)));
end
else
begin
// файл НЕ скопирован
memo1.Lines.Add("Ошибка копирования "+TempFile.Name + " " + DateTimeToStr(FileDateToDateTime(TempFile.Time)));
InstOK := false;
end
end
else
begin
// старый файл занят
sleep(5000);
If CheckFileFree(ExtractFilePath(paramstr(0))+TempFile.Name) = true
then
begin
// старый файл освободился
If copyFile(pchar(NewSoftLoc+InstFile.Name),pchar(ExtractFilePath(paramstr(0))+TempFile.Name),false)
then
begin
// обновление склалось
memo1.Lines.Add("Установлен файл "+InstFile.Name + " " + DateTimeToStr(FileDateToDateTime(InstFile.Time)));
end
else
begin
// файл НЕ скопирован
memo1.Lines.Add("Ошибка копирования "+TempFile.Name + " " + DateTimeToStr(FileDateToDateTime(TempFile.Time)));
InstOK := false;
end
end
else
begin
memo1.Lines.Add("Файл недоступен "+TempFile.Name + " " + DateTimeToStr(FileDateToDateTime(TempFile.Time)));
InstOK := false;
end;
end;
end
else
begin
// версия на локалке совпадает
memo1.Lines.Add("Версия совпадает " + TempFile.Name + " " + DateTimeToStr(FileDateToDateTime(TempFile.Time)));
end;
end
else
begin
// если на локалке нет такого файла
if CopyFile(pchar(NewSoftLoc+InstFile.Name),pchar(ExtractFilePath(paramstr(0))+ InstFile.Name),false)
then
begin
// скоприровано успешно
memo1.Lines.Add("Установлен файл "+InstFile.Name + " " + DateTimeToStr(FileDateToDateTime(InstFile.Time)));
end
else
begin
// ошибки копирования
memo1.Lines.Add("Ошибка установки "+InstFile.Name + " " + DateTimeToStr(FileDateToDateTime(InstFile.Time)));
InstOK := false;
end;
end;
FindClose(TempFile);
end
← →
Андрей Сенченко © (2004-04-21 11:52) [12]Функция проверки файла на доступность у меня лично такая
Function CheckFileFree(fname:string) : boolean;
var
HFile : hwnd;
begin
HFile := CreateFile(pchar(fname),
GENERIC_READ + GENERIC_WRITE,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0
);
If HFile <> INVALID_HANDLE_VALUE
then checkfilefree := true
else checkfilefree := false;
CloseHandle(HFile);
end;
Хотя многие предпочитают просто{$I-}
Assign
Reset
{$I+}
If IOResult ...
← →
Андрей Сенченко © (2004-04-21 11:52) [12]Функция проверки файла на доступность у меня лично такая
Function CheckFileFree(fname:string) : boolean;
var
HFile : hwnd;
begin
HFile := CreateFile(pchar(fname),
GENERIC_READ + GENERIC_WRITE,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0
);
If HFile <> INVALID_HANDLE_VALUE
then checkfilefree := true
else checkfilefree := false;
CloseHandle(HFile);
end;
Хотя многие предпочитают просто{$I-}
Assign
Reset
{$I+}
If IOResult ...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.035 c