Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование файлов 
:(
    Опции темы
kwotz
Дата 11.1.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 25
Регистрация: 6.1.2007
Где: Майкоп

Репутация: нет
Всего: нет



Такая проблема: с помощью процедуры CopyFile копирую файлы, которые определяю с помощью процедуры GetFiles (обе процедуры ниже). Так вот, проблема в следующем – дома прога работает на ура, без каких-либо проблем копирует все. Но стоило притащить прогу в универ пошло-поехало. Я сначала пытался скопировать с другой машины на свою, но вылетела ошибка: «Не могу скопировать файл. Код ошибки «-1»(вроде так)». Я подумал, может не хочет работать с удаленными машинами. Но на локальной (своей) тоже самое. Пытался копировать под разными правами (и админа и юзера), на разных машинах (сервере и локальной), под разными ОС (ХР и NT4.0) результат тот же. В чем косяк – дома ведь работает? Да, кстати, в каталоге, куда копируются файлы, появляется файл, который прога пыталась скопировать, но он нулевого размера.

Код

procedure CopyFile(Source, Dest: string);
var
  SrcFile: Integer;
  DestFile: Integer;
  S: string;
  RetCode: Longint;
  OpenFileBuf: TOFStruct;
  FName: array[0..255] of Char;
begin
  StrPCopy(FName, Source);
  SrcFile := LZOpenFile(FName, OpenFileBuf, of_Read);
  StrPCopy(FName, Dest);
  DestFile := LZOpenFile(FName, OpenFileBuf, of_Create);

  RetCode := LZCopy(SrcFile, DestFile);
  if RetCode >= 0 then
  begin
    LZClose(SrcFile);
    LZClose(DestFile);
  end
  else
  begin
    Str(RetCode, S);
    MessageDlg('Не могу скопировать ' + Source + ' в ' +
      Dest + #13 + 'Код ошибки = ' + S, mtError, [mbOk], 0);
  end;
end;


Код

procedure GetFiles(const DirStr : string; ListBox : TListBox);
var
  DirInfo: TSearchRec;
  r : Integer;
begin
  r := FindFirst(DirStr + '\*.*', FaAnyfile, DirInfo);
    while r = 0 do
      begin
        Application.ProcessMessages;
        if ((DirInfo.Attr and FaDirectory <> FaDirectory) and
        (DirInfo.Attr and FaVolumeId <> FaVolumeID)) then
          ListBox.Items.Add(DirStr + DirInfo.Name);
          r := FindNext(DirInfo);
      end;
  SysUtils.FindClose(DirInfo);
end;

PM MAIL   Вверх
VICTAR
Дата 11.1.2007, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



А кто такие LZOpenFile, LZCopy и т.д. Из какого модуля?
PM MAIL   Вверх
Sunvas
Дата 11.1.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Может в процедуре копирования проблема? Поищи по форуму другие способы копирования.

Добавлено @ 13:31 
Вот, попробуй эти:
http://forum.vingrad.ru/index.php?showtopi...st&p=987985


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
aktuba
Дата 11.1.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



А так не подойдет:

Код

procedure CopyFile(Source, Dest: string);
var
  lStream: TMemoryStream;
begin
  lStream := TMemoryStream.Create;
  try
    lStream.LoadFromFile(Source);
    lStream.SaveToFile(Dest);  
  finally
    FreeAndNil(lStream);
  end;
end;



--------------------
user posted image
PM MAIL WWW Skype   Вверх
VICTAR
Дата 11.1.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Или вообще так: 
Код

CopyFile('C:\temp.txt', 'D:\temp.txt',true);


Это сообщение отредактировал(а) VICTAR - 11.1.2007, 13:38
PM MAIL   Вверх
MetalFan
Дата 11.1.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



с какой целью применили функции LZ***?
The following functions are used to decompress files that were compressed by the Lempel-Ziv algorithm.

такое ощущение, что код тупо сперт откуда-то... или написан бездумно абсолютно.
сразу в глаза бросаются ощибки:
1) не очищается OpenFileBuf
2) в этой структуре первым полем должен идти ее размер.
3) никак не анализируется результат LZOpenFile
...
продолжать???

а вообще сделал бы, как тебе посоветовал VICTAR
код от aktuba лучше не "употреблять" ;) догадаетесь почему?


Это сообщение отредактировал(а) MetalFan - 11.1.2007, 15:11


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
kwotz
Дата 11.1.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 25
Регистрация: 6.1.2007
Где: Майкоп

Репутация: нет
Всего: нет



LZOpenFile, LZCopy из модуля LZExpand. Код и вправду тупо скопирован. Просто мне важна фишка копирования с других машин, а по заявлению автора этот код позволяет это сделать.  

CopyFile('C:\temp.txt', 'D:\temp.txt',true); - по сетке позволит копировать, строку для копирования я буду получать через процедуру:

Код

procedure TForm2.Button3Click(Sender: TObject);
var
  bi: TBrowseInfo;
  s: PChar;
  PIDL, ResPIDL: PItemIDList;
begin
  SHGetSpecialFolderLocation(Form2.Handle, CSIDL_DESKTOP, PIDL);
  s := StrAlloc(128);
  bi.hwndOwner := Form1.Handle;
  bi.pszDisplayName := s;
  bi.lpszTitle := 'Выбор прапки';
  bi.pidlRoot := PIDL;
  bi.lpfn := addr(CallBack);
  bi.ulFlags:=BIF_NEWDIALOGSTYLE;
  ResPidl := SHBrowseForFolder(BI);
  SHGetPathFromIDList(ResPidl, s);
  Edit1.Text := s;
  Form2.SetFocus;
end;

PM MAIL   Вверх
dimazu
Дата 11.1.2007, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



LZ функции работают со сжатыми файлами, т.е.
копирование будет типа быстрее...  smile 
Они API из библиотеки LZ32.DLL 
Но глюкавые...  smile 
Например не могут работать с locked файлами (возможно
твой случай) и т.д.
Я их пытался использовать для паковки/распаковки своих архивов,
типа ZIP, когда удачно, когда нет (чаще удачно ;) ),
а для простого копирования - есть CopyFile, как уже
сказали.

Это сообщение отредактировал(а) dimazu - 11.1.2007, 18:48
PM MAIL   Вверх
dimazu
Дата 11.1.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



to MetalFan:
Да, кстати, чем плохо копировать через стрим?
Может чего не понимаю...
Я делаю примерно так, через TFileStream:
Код

procedure TForm1.FileCopy(sSrcPath, sDestPath, sFileName: string);
Var
  S, T: TFileStream;
Begin {1}
  S := TFileStream.Create(sSrcPath + sFileName, fmOpenRead);
  try 
    T := TFileStream.Create(sDestPath + sFileName,
      fmOpenWrite or fmCreate);
    try 
      T.CopyFrom(S, S.Size);
    finally
      T.Free;
    end; 
  finally
    S.Free;
  end; 
end; {1}


PM MAIL   Вверх
MetalFan
Дата 11.1.2007, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



dimazu, в приведенном ранее примере копирование производилось через MemoryStream... сначала загружался файл в память, потом сохранялся на диск.
в вашем примере все ок!


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
~FoX~
Дата 12.1.2007, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Цитата(kwotz @  11.1.2007,  17:29 Найти цитируемый пост)
по сетке позволит копировать, 

CopyFile вполне нормально переваривает унце пути...Так, что капируй наздоровье и не морочь себе голову.


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
kwotz
Дата 12.1.2007, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 25
Регистрация: 6.1.2007
Где: Майкоп

Репутация: нет
Всего: нет



Код

CopyFile('C:\temp.txt', 'D:\temp.txt',true);
 - в таком ввиде работает нормально, и у меня дома и в универе, аналогично, если использую едиты, в которые ввожу в ручную адреса, но как только пытаюсь использовать при определении каталога и файла процедуры, что описана выше и что будет ниже, то все не копирует, но при это ошибки нет и файл не копируется (анамалия какая-то):

Код

procedure GetFiles(const DirStr : string; ListBox : TListBox);
var
  DirInfo: TSearchRec;
  r : Integer;
begin
  r := FindFirst(DirStr + '\*.*', FaAnyfile, DirInfo);
    while r = 0 do
      begin
        Application.ProcessMessages;
        if ((DirInfo.Attr and FaDirectory <> FaDirectory) and
        (DirInfo.Attr and FaVolumeId <> FaVolumeID)) then
          ListBox.Items.Add(DirStr + '\' + DirInfo.Name);
          r := FindNext(DirInfo);
      end;
  SysUtils.FindClose(DirInfo);
end;

PM MAIL   Вверх
VICTAR
Дата 12.1.2007, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



CopyFile не создает директории, их надо создавать вручную. Ты как делаешь?
PM MAIL   Вверх
Sunvas
Дата 12.1.2007, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(VICTAR @  12.1.2007,  20:45 Найти цитируемый пост)
Ты как делаешь?

ForceDirectories



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
kwotz
Дата 14.1.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 25
Регистрация: 6.1.2007
Где: Майкоп

Репутация: нет
Всего: нет



А я и не создаю директорию, есть готовые директории: и откуда копируется и куда. В самом начале есть процедура GetFiles, вот с помощью нее и показываю откуда копирую, а куда по умолчанию!!!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0620 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.