Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проверка готовности диска А и копирование на дискету [D7, XP]


Страницы:   1 2

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо