![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проверка готовности диска А и копирование на дискету [D7, XP]
Sw © (2009-09-01 09:18:00)
function IsDriveReady(const Drive: char): Boolean;
var
DrvNum: byte;
EMode: Word;
begin
result := true;
DrvNum := ord(Drive);
if DrvNum >= ord('a') then
dec(DrvNum, $20);
EMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
while DiskSize(DrvNum - $40) = -1 do
begin
case (Application.MessageBox('Диск не готов...' + chr(13) + chr(10) +
'Повторить?', PChar('Диск ' + UpperCase(Drive)), mb_OKCANCEL +
mb_iconexclamation {IconQuestion})) of
IDOK:IsDriveReady(Drive);
IDCANCEL: begin Result := false; Break; end;
end;
end;
finally
SetErrorMode(EMode);
end;
end;
//процедура копирования файлов//
function WindowsCopyFile(FromFile, ToDir : string) : boolean;
var
F: TShFileOpStruct;
begin
F.Wnd := 0; F.wFunc := FO_COPY;
FromFile:=FromFile+#0; F.pFrom:=pchar(FromFile);
ToDir:=ToDir+#0; F.pTo:=pchar(ToDir);
F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
result:=ShFileOperation(F) = 0;
end;
.....................................................
if IsDriveReady(device) then
if WindowsCopyFile(sFileName,export_folder) then
Application.MessageBox('Данные выгружены успешно', 'Окно сообщений', MB_ICONINFORMATION);
.....................................................
Помогите, пожалуйста, разобаться. Если дискета установлена, то все правильно отрабатывает. А если диск не обнаружен ('Диск не готов...' + 'Повторить?',) -> вставляем дискету и нажимаем Повторить....выдает сообщение: "Данные выгружены успешно' , но ничего на дискету не выгружает.
Sw (2009-09-02 06:19:00) [1]Спасибо огромное за помощь, действительно, проблема с папкой-назначение.
export_folder:=LongPathToShort(AppIni.ReadString('Export', 'Export_folder',''));
в случае отсутствия дискеты export_folder не определено
я так понимаю, это происходит, т.к. для LongPathToShort необходимо, чтобы путь существовал.
clickmaker (2009-09-01 14:59:00) [2]> файлик создается в каталоге с EXE-ком проги
значит функция копирует его в текущий каталог. То есть папка-назначение все-таки неправильно указана.
Видимо, когда это работало, текущим был диск А
Sw (2009-09-01 14:59:00) [3]и если на момент копирования в export_folder полный путь к файлу ...ничего не меняется
Sw (2009-09-01 14:53:00) [4]в sFileName полный путь к файлу
в export_folder - A:\
это у меня dll-ка....ссори...не знаю как смотреть в отладчике....
сейчас заметила, что после замены на ваш код (IsDriveReady) файлик создается в каталоге с EXE-ком проги (это когда после "Повторить?")
clickmaker (2009-09-01 14:32:00) [5]то есть на момент копирования в sFileName,export_folder находятся полные пути к файлу и целевой папке? и это видно в отладчике?
Sw (2009-09-01 14:27:00) [6]
//преобразование длинного пути в короткий//
function LongPathToShort(path:string):string;
var buffer:string; len:integer;
begin
SetLength(buffer, MAX_PATH);
len:=GetShortPathName(PAnsiChar(path), PAnsiChar(buffer), MAX_PATH);
SetLength(buffer, len);
LongPathToShort:=buffer;
end;
var export_folder_default:string;
export_folder:string;
sdt:TDate;
fdt:string;
AppIni: TIniFile;
//sFileName****************************************************
export_folder_default:=LongPathToShort(ExtractFilePath(Application.ExeName)+'\sod\');
sdt:=Date;
DateTimeToString(fdt,'mmdd',sdt);
sFileName:=export_folder_default + '4777'+fdt+'.zip';
//export_folder *************************************************
AppIni := TIniFile.Create(ExtractFilePath(Application.ExeName)+'sod.ini');
device:=AppIni.ReadString('Export', 'Export_folder','')[1];
export_folder:=LongPathToShort(AppIni.ReadString('Export', 'Export_folder',''));
AppIni.Free;
clickmaker (2009-09-01 14:11:00) [7]ну хорошо...
как выглядят sFileName и export_folder в данном случае?
Sw (2009-09-01 14:03:00) [8]полностью заменяю на ваш код......если дискета стоит....отрабатывает как положено.....тока уберу ...выдает Повторить? вставляю дискету, ентер ...пишет, что скопировал....а на самом деле нету ничего на дискете
clickmaker (2009-09-01 13:46:00) [9]> то же самое получаю
что-то не верится...
вот так все должно работать
function IsDriveReady(const Drive: char): Boolean;
var
DrvNum: byte;
EMode: Word;
begin
result := true;
DrvNum := ord(Drive);
if DrvNum >= ord('a') then
dec(DrvNum, $20);
dec(DrvNum, $40);
EMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
while DiskSize(DrvNum) = -1 do
begin
if Application.MessageBox(PChar('Диск не готов...'#13#10'Повторить?'),
PChar('Диск ' + UpperCase(Drive)), mb_OKCANCEL +
mb_iconexclamation) = IDCANCEL then begin
Result := false;
Break;
end;
end;
finally
SetErrorMode(EMode);
end;
end;
Sw (2009-09-01 13:30:00) [10]и убрав эту строку ...то же самое получаю
clickmaker (2009-09-01 13:27:00) [11]не говоря уже о том, что результат здесь игнорируется
IDOK:IsDriveReady(Drive);
clickmaker (2009-09-01 13:26:00) [12]а зачем рекурсивный вызов IsDriveReady, если там и так цикл?
Sw (2009-09-01 13:24:00) [13]а разве у меня не так? в функции WindowsCopyFile именно так и написано:
FromFile:=FromFile+#0;
и копирую я на дискету один файл (правда, это zip-архив и содержит он три файла).
И почему тогда, если дискета установлена, то все копируется и все красиво.
А если нет дискетки, делаем "Повторить"....и не копирует.
Anatoly Podgoretsky (2009-09-01 12:57:00) [14]Есть
FromFile+#0
F1 по типу string
Student (2009-09-01 12:56:00) [15]FromFile:=FromFile+#0
я на дискетку всегда вот так писал, может поможет
FileName := FileName + '0';
clickmaker (2009-09-01 12:56:00) [16]> разъясните пожалуйста, будьте добры
при копировании нескольких файлов, их имена разделяются нулем. А чтобы обозначить конец списка, добавляется еще один ноль
Sw (2009-09-01 12:43:00) [17]http://www.delphimaster.ru/articles/advice/top.html
(Копирование методами Windows)
ну не дошло про нолики.....внимательно смотрю..по второму нулю не вижу ..разъясните пожалуйста, будьте добры
KilkennyCat (2009-09-01 12:05:00) [18]
> а где у меня ошибка?
В отсутствии внимательности. Вдумчиво читаем про нолики.
Sw (2009-09-01 12:04:00) [19]ужасы какие
Sw (2009-09-01 12:03:00) [20]
> Virgo_Style
слава Богу, у меня копирование.:(...сожалею Вам
а где у меня ошибка?