Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2009, 15:15   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Копирование директории

Добрый вечер! Вот тут есть у меня код копирования папки. Выдает ошибку в выделенной строке "Undeclared identifire 'HasAttr'":
Код:
procedure TForm1.SpeedButton3Click(Sender: TObject);
var
 FileName,DestName: string;
 CopyBuffer: Pointer;
 BytesCopied: Longint;
 Source,Dest,Len: Integer;
 Destination: string;
const
 ChunkSize: Longint = 8192;
begin
 Destination:=ExpandFileName(DestName);
 if HasAttr(Destination,faDirectory) then
   begin
    Len:=Length(Destination);
      if Destination[Len]='\' then
        Destination:=Destination+ExtractFileName(FilName)
      else
        Destination:=Destination+'\'+ExtractFileName(FileName);
   end;
 GetMem(CopyBuffer,ChunkSize);
   try
     Source:=FileOpen(FileName,fmShareDenyWrite);
     if Source < 0 then
       Raise EFOpenError.CreateFmt(SFOpenError,[FileName]);
     try
       Dest:=FileCreate(Destination);
       if Dest < 0 then
         Raise EFCreateError.CreateFmt(SFCreateError,[Destination]);
       try
         Repeat
           if BytesCopied > 0 then
             FileWrite(Dest,CopyBuffer^,BytesCopied);
         Until BytesCopied < ChunkSize;
     finally
      FileClose(Dest);
     end;
   finally
    FileClose(Source);
   end;
 finally
  FreeMem(CopyBuffer,ChunkSize);
 end;

end;
Вопрос: как правильно объявить эту функцию?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 16.01.2009, 15:22   #2
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

вот посмотри функцию :
Код:
 
procedure CopyFiles(const FromFolder: string; const ToFolder: string); 
var 
  Fo      : TSHFileOpStruct; 
  buffer  : array[0..4096] of char; 
  p       : pchar; 
begin 
  FillChar(Buffer, sizeof(Buffer), #0); 
  p := @buffer; 
  StrECopy(p, PChar(FromFolder)); //директория, которую мы хотим скопировать
  FillChar(Fo, sizeof(Fo), #0); 
  Fo.Wnd    := Application.Handle; 
  Fo.wFunc  := FO_COPY; 
  Fo.pFrom  := @Buffer; 
  Fo.pTo    := PChar(ToFolder); //куда будет скопирована директория
  Fo.fFlags := 0; 
  if ((SHFileOperation(Fo) <> 0) or (Fo.fAnyOperationsAborted <> false)) then 
    ShowMessage('File copy process cancelled') 
end; 
end.
Зависимость : SysUtils, ShellAPI, Dialogs
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 16.01.2009, 15:38   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Дело в том, что у меня должно копирование происходить на компоненте ShellListView. А ошибку мне в моем коде подправить все равно надо). Эта HasAttr у меня использоваться и других процедурах. Может подскажите как объявить его?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 16.01.2009, 16:04   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Эта функция, похоже, "самопальная"?
То есть она у вас где-то описана как function HasAttr(...).
Но... судя по всему, неправильно расположена. Перенесите ее целиком в самое начало, то есть после
implementation

{$R *.dfm}

Тогда она будет "видна" отовсюду.
Ну, а уж если она у вас и вовсе не описана...
mihali4 вне форума Ответить с цитированием
Старый 16.01.2009, 16:40   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

mihali4, из того источника, откуда я взял этот код, я не нашел описания этой функции. Может вы подправите мой код?)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 16.01.2009, 16:49   #6
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Если не ошибаюсь, то функция HasAttr описывается так:
Код:
Function HasAttr(Const FileName: String; Attr: Word): Boolean;
Var
FileAttr: Integer;
Begin
FileAttr:=FileGetAttr(FileName);
If FileAttr=-1 Then
FileAttr:=0;
Result:=(FileAttr And Attr) = Attr;
End;
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 16.01.2009, 16:54   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Может вы подправите мой код?
А это что - ВЕСЬ КОД??? Враки (пардон ).
Выкладывайте все, что вам удалось "выкрасть" у источника , посмотрим, что можно сделать...
А может, и того, что привел Terran, вам вполне хватит...

Последний раз редактировалось mihali4; 16.01.2009 в 16:56.
mihali4 вне форума Ответить с цитированием
Старый 16.01.2009, 17:06   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Вот весь код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, ShellCtrls, XPMan, ShellAPI, FileCtrl,
  Menus, Buttons, ToolWin, ImgList;

type
  TForm1 = class(TForm)
    XPManifest1: TXPManifest;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    ShellListView1: TShellListView;
    ShellListView2: TShellListView;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    ToolBar1: TToolBar;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    Splitter1: TSplitter;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    SpeedButton5: TSpeedButton;
    Splitter2: TSplitter;
    ToolButton1: TToolButton;
    PopupMenu1: TPopupMenu;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    ImageList1: TImageList;
    ShellTreeView1: TShellTreeView;
    procedure N2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    function HasAttr(const FileName: String; Attr:Word):Boolean;

  private

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.N2Click(Sender: TObject);
begin
 close;
end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
var
 FileName,DestName: string;
 CopyBuffer: Pointer;
 BytesCopied: Longint;
 Source,Dest,Len: Integer;
 Destination: string;
const
 ChunkSize: Longint = 8192;
begin
 Destination:=ExpandFileName(DestName);
 if HasAttr(Destination,faDirectory) then
   begin
    Len:=Length(Destination);
      if Destination[Len]='\' then
        Destination:=Destination+ExtractFileName(FileName)
      else
        Destination:=Destination+'\'+ExtractFileName(FileName);
   end;
 GetMem(CopyBuffer,ChunkSize);
   try
     Source:=FileOpen(FileName,fmShareDenyWrite);
     if Source < 0 then
       Raise EFOpenError.CreateFmt(SFOpenError,[FileName]);
     try
       Dest:=FileCreate(Destination);
       if Dest < 0 then
         Raise EFCreateError.CreateFmt(SFCreateError,[Destination]);
       try
         Repeat
           if BytesCopied > 0 then
             FileWrite(Dest,CopyBuffer^,BytesCopied);
         Until BytesCopied < ChunkSize;
     finally
      FileClose(Dest);
     end;
   finally
    FileClose(Source);
   end;
 finally
  FreeMem(CopyBuffer,ChunkSize);
 end;
end.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 16.01.2009, 17:34   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Вот весь код
Вы не поняли...
Берутся файлы типа Project1.dpr, Unit1.pas, Unit1.dfm и так далее, пакуются в один РАР архив и выкладываются "прицепом" - это "Расширенный режим", там есть значок со скрепкой - жмакаем на него, задаем архив, "Загрузить".
Потом - после закрытия того окошка - опять "скрепка" и там выбираем загруженный архив.
В результате он будет прицеплен в тексте вашего поста и мы его скачаем.

А сейчас что? Восстанавливать вашу форму? Неохота...
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сканирование директории D!zel Общие вопросы Delphi 8 22.12.2009 21:11
Выбор директории Kashp Общие вопросы Delphi 6 06.05.2009 06:29
выбор директории Var17 Win Api 5 13.05.2008 13:50
отправка директории kommunist Работа с сетью в Delphi 2 19.01.2008 17:24
Проверка существования директории Gorin Общие вопросы Delphi 7 25.11.2007 19:47