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

Вниз

проверка готовности диска А и копирование на дискету   Найти похожие ветки 

 
Sw   (2009-09-01 09:18) [0]

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);
.....................................................


Помогите, пожалуйста, разобаться. Если дискета установлена, то все правильно отрабатывает. А если диск не обнаружен  ("Диск не готов..." + "Повторить?",) -> вставляем дискету и нажимаем Повторить....выдает сообщение: "Данные выгружены успешно" , но ничего на дискету не выгружает.


 
Virgo_Style ©   (2009-09-01 10:56) [1]


>  FromFile:=FromFile+#0


Тебе хорошо, у тебя копирование, а когда я при удалении второй нолик добавить забыл - ой что былоооо...


 
clickmaker ©   (2009-09-01 11:45) [2]

> ой что былоооо

а что было? диск почистился? )


 
Anatoly Podgoretsky ©   (2009-09-01 11:57) [3]

> clickmaker  (01.09.2009 11:45:02)  [2]

У меня однажды Виндоус деинсталировался :-)


 
Sw   (2009-09-01 12:03) [4]


> Virgo_Style

слава Богу, у меня копирование.:(...сожалею Вам
а где у меня ошибка?


 
Sw   (2009-09-01 12:04) [5]

ужасы какие


 
KilkennyCat ©   (2009-09-01 12:05) [6]


> а где у меня ошибка?

В отсутствии внимательности. Вдумчиво читаем про нолики.


 
Sw   (2009-09-01 12:43) [7]

http://www.delphimaster.ru/articles/advice/top.html
(Копирование методами Windows)
ну не дошло про нолики.....внимательно смотрю..по второму нулю не вижу ..разъясните пожалуйста, будьте добры


 
clickmaker ©   (2009-09-01 12:56) [8]

> разъясните пожалуйста, будьте добры

при копировании нескольких файлов, их имена разделяются нулем. А чтобы обозначить конец списка, добавляется еще один ноль


 
Student ©   (2009-09-01 12:56) [9]

FromFile:=FromFile+#0

я на дискетку всегда вот так писал, может поможет
FileName := FileName + "0";


 
Anatoly Podgoretsky ©   (2009-09-01 12:57) [10]

Есть
FromFile+#0
F1 по типу string


 
Sw   (2009-09-01 13:24) [11]

а разве у меня не так? в функции WindowsCopyFile  именно так и написано:
FromFile:=FromFile+#0;
и копирую я на дискету один файл (правда, это zip-архив и содержит он три файла).
И почему тогда, если дискета установлена, то все копируется и все красиво.
А если нет дискетки, делаем "Повторить"....и не копирует.


 
clickmaker ©   (2009-09-01 13:26) [12]

а зачем рекурсивный вызов IsDriveReady, если там и так цикл?


 
clickmaker ©   (2009-09-01 13:27) [13]

не говоря уже о том, что результат здесь игнорируется
IDOK:IsDriveReady(Drive);


 
Sw   (2009-09-01 13:30) [14]

и убрав эту строку ...то же самое получаю


 
clickmaker ©   (2009-09-01 13:46) [15]

> то же самое получаю

что-то не верится...
вот так все должно работать

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 14:03) [16]

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


 
clickmaker ©   (2009-09-01 14:11) [17]

ну хорошо...
как выглядят sFileName и export_folder в данном случае?


 
Sw   (2009-09-01 14:27) [18]

//преобразование длинного пути в короткий//
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:32) [19]

то есть на момент копирования в sFileName,export_folder находятся полные пути к файлу и целевой папке? и это видно в отладчике?


 
Sw   (2009-09-01 14:53) [20]

в sFileName  полный путь к файлу
в export_folder - A:\

это у меня dll-ка....ссори...не знаю как смотреть в отладчике....

сейчас заметила, что после замены на ваш код (IsDriveReady) файлик создается в каталоге с EXE-ком проги (это когда после "Повторить?")


 
Sw   (2009-09-01 14:59) [21]

и если на момент копирования в export_folder полный путь к файлу ...ничего не меняется


 
clickmaker ©   (2009-09-01 14:59) [22]

> файлик создается в каталоге с EXE-ком проги

значит функция копирует его в текущий каталог. То есть папка-назначение все-таки неправильно указана.
Видимо, когда это работало, текущим был диск А


 
Sw   (2009-09-02 06:19) [23]

Спасибо огромное за помощь, действительно, проблема с папкой-назначение.  
export_folder:=LongPathToShort(AppIni.ReadString("Export", "Export_folder",""));
в случае отсутствия дискеты export_folder не определено
я так понимаю, это происходит, т.к.  для LongPathToShort необходимо, чтобы путь существовал.



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

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

Наверх




Память: 0.52 MB
Время: 0.013 c
15-1251178540
Andy BitOff
2009-08-25 09:35
2009.10.25
Что думают знатоки по поводу такой конфигурации?


15-1251144306
DillerXX
2009-08-25 00:05
2009.10.25
Как переводится Nightwish?


2-1251359821
griff
2009-08-27 11:57
2009.10.25
Интенет.Авторизация.


2-1251993467
Eugene1501
2009-09-03 19:57
2009.10.25
Какое событие вызывает перемещение окна


15-1250890438
Германн
2009-08-22 01:33
2009.10.25
Extra-USB порты на матплате.