隨筆 - 6  文章 - 129  trackbacks - 0
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(14)

          隨筆檔案(6)

          文章分類(467)

          文章檔案(423)

          相冊

          收藏夾(18)

          JAVA

          搜索

          •  

          積分與排名

          • 積分 - 828809
          • 排名 - 49

          最新評論

          閱讀排行榜

          評論排行榜

          Delphi中關于文件、目錄操作的函數 



          來源:大富翁



          關于文件、目錄操作



          Chdir('c:\abcdir'); // 轉到目錄

          Mkdir('dirname'); //建立目錄

          DirectoryExists('dirname') //判斷目錄是否存在

          Rmdir('dirname'); //刪除目錄(目錄不存在會報異常)

          GetCurrentDir; //取當前目錄名,無'\'

          Getdir(0,s); //取工作目錄名s:='c:\abcdir';

          Deletfile('abc.txt'); //刪除文件

          Renamefile('old.txt','new.txt'); //文件更名

          ExtractFilename(filelistbox1.filename); //取文件名

          ExtractFileExt(filelistbox1.filename); //取文件后綴





          目錄處理函數三則:DelTree,XCopy,Move



          private

          { Private declarations }

          procedure _XCopy(ASourceDir:String; ADestDir:String);

          procedure _Move(ASourceDir:String; ADestDir:String);

          procedure _DelTree(ASourceDir:String);



          //----------------------------------------------------------

          procedure TForm1._XCopy(ASourceDir:String; ADestDir:String);

          var

          FileRec:TSearchrec;

          Sour:String;

          Dest:String;

          begin

          Sour:=ASourceDir;

          Dest:=ADestDir;



          if Sour[Length(Sour)]<>'\' then Sour := Sour + '\';

          if Dest[Length(Dest)]<>'\' then Dest := Dest + '\';



          if not DirectoryExists(ASourceDir) then

          begin

          ShowMessage('來源目錄不存在!!');

          exit;

          end;



          if not DirectoryExists(ADestDir) then

          begin

          ForceDirectories(ADestDir);

          end;



          if FindFirst(Sour+'*.*',faAnyfile,FileRec) = 0 then

          repeat

          if ((FileRec.Attr and faDirectory) <> 0) then

          begin

          if (FileRec.Name<>'.') and (FileRec.Name<>'..') then

          begin

          _XCopy(Sour+FileRec.Name,Dest+FileRec.Name);

          end;

          end

          else

          begin

          CopyFile(PChar(Sour+FileRec.Name),PChar(Dest+FileRec.Name),false);

          end;

          until FindNext(FileRec)<>0;



          FindClose(FileRec);



          end;

          //------------------------------------------------------------------

          procedure TForm1._Move(ASourceDir:String; ADestDir:String);

          var

          FileRec:TSearchrec;

          Sour:String;

          Dest:String;

          begin

          Sour:=ASourceDir;

          Dest:=ADestDir;



          if Sour[Length(Sour)]<>'\' then Sour := Sour + '\';

          if Dest[Length(Dest)]<>'\' then Dest := Dest + '\';



          if not DirectoryExists(ASourceDir) then

          begin

          ShowMessage('來源目錄不存在!!');

          exit;

          end;



          if not DirectoryExists(ADestDir) then

          begin

          ForceDirectories(ADestDir);

          end;



          if FindFirst(Sour+'*.*',faAnyfile,FileRec) = 0 then

          repeat

          if ((FileRec.Attr and faDirectory) <> 0) then

          begin

          if (FileRec.Name<>'.') and (FileRec.Name<>'..') then

          begin

          _XCopy(Sour+FileRec.Name,Dest+FileRec.Name);



          _DelTree(Sour+FileRec.Name);



          FileSetAttr(Sour+FileRec.Name,faArchive);

          RemoveDir(Sour+FileRec.Name);

          end;

          end

          else

          begin

          CopyFile(PChar(Sour+FileRec.Name),PChar(Dest+FileRec.Name),false);



          FileSetAttr(Sour+FileRec.Name,faArchive);

          deletefile(Sour+FileRec.Name);

          end;

          until FindNext(FileRec)<>0;



          FindClose(FileRec);



          FileSetAttr(Sour,faArchive);

          RemoveDir(Sour);



          end;

          //-----------------------------------------------------------

          procedure TForm1._DelTree(ASourceDir:String);

          var

          FileRec:TSearchrec;

          Sour:String;

          begin

          Sour:=ASourceDir;

          if Sour[Length(Sour)]<>'\' then Sour := Sour + '\';



          if not DirectoryExists(ASourceDir) then

          begin

          ShowMessage('來源目錄不存在!!');

          exit;

          end;



          if FindFirst(Sour+'*.*',faAnyfile,FileRec) = 0 then

          repeat

          //if (FileRec.Attr = faDirectory) then

          if ((FileRec.Attr and faDirectory) <> 0) then

          begin

          if (FileRec.Name<>'.') and (FileRec.Name<>'..') then

          begin

          _DelTree(Sour+FileRec.Name);



          FileSetAttr(Sour+FileRec.Name,faArchive);

          RemoveDir(Sour+FileRec.Name);

          end;

          end

          else

          begin

          FileSetAttr(Sour+FileRec.Name,faArchive);

          deletefile(Sour+FileRec.Name);

          end;

          until FindNext(FileRec)<>0;



          FindClose(FileRec);



          FileSetAttr(Sour,faArchive);

          RemoveDir(Sour);



          end;





          利用遞歸實現刪除某一目錄下所有文件



          var Form1: TForm1;

          rec_stack:array [1..30] of TSearchRec;

          rec_pointer:integer;

          Del_Flag:Boolean;

          ---------------------------------------------------------------

          procedure TForm1.DeleteTree(s:string);

          VAR searchRec:TSearchRec;

          begin

          if FindFirst(s+'\*.*', faAnyFile, SearchRec)=0 then

          repeat

          if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then

          begin

          if (SearchRec.Attr and faDirectory>0) then

          begin

          rec_stack[rec_pointer]:=SearchRec;

          rec_pointer:=rec_pointer-1;

          DeleteTree(s+'\'+SearchRec.Name);

          rec_pointer:=rec_pointer+1;

          SearchRec:=rec_stack[rec_pointer];

          end

          else

          begin

          try

          FileSetAttr(s+'\'+SearchRec.Name,faArchive);

          DeleteFile(s+'\'+SearchRec.Name);

          except

          Application.MessageBox(PChar('Delete file:'+s+'\'+SearchRec.Name+' Error!'),'Info',MB_OK);

          Del_Flag:=False;

          end;

          end;

          end;

          until (FindNext(SearchRec)<>0);

          FindClose(SearchRec);

          if rec_pointer<30 then

          begin

          try

          FileSetAttr(s,faArchive);

          RemoveDir(s);

          except

          Application.MessageBox(PChar('Delete Directory:'+s+' Error!'),'Info',MB_OK);

          Del_Flag:=False;

          end;

          end;

          end;

          ---------------------------------------------------------

          Del_Flag:=True;

          rec_pointer:=30;

          DeleteTree('c:\temp');

          if Del_Flag then Application.MessageBox(PChar('目錄c:\temp的內容已成功清除!'),'信息',MB_OK);





          輕輕松松查找文件

          在平常的編程當中,經常會碰到查找某一個目錄下某一類文件或者所有文件的問題,為了適應不同的需要,我們經常不得不編寫大量的類似的代碼,有沒有可能寫一個通用的查找文件的程序,找到一個文件后就進行處理的呢?這樣我們只要編寫處理文件的部分就可以了,不需要編寫查找文件的部分!答案是肯定的。下面的這個程序就能實現這個功能!

          //說明:

          //TFindCallBack為回調函數,FindFile函數找到一個匹配的文件之后就會調用這個函數。

          //TFindCallBack的第一個參數找到的文件名,你在回調函數中可以根據文件名進行操作。

          //TFindCallBack的第二個參數為找到的文件的記錄信息,是一個TSearchRec結構。

          //TFindCallBack的第三、四個參數分別為決定是否終止文件的查找,臨時決定是否查找某個子目錄!

          //FindFile的參數:

          //第一個決定是否退出查找,應該初始化為false;

          //第二個為要查找路徑;

          //第三個為文件名,可以包含Windows所支持的任何通配符的格式;默認所有的文件

          //第四個為回調函數,默認為空

          //第五個決定是否查找子目錄,默認為查找子目錄

          //第六個決定是否在查找文件的時候處理其他的消息,默認為處理其他的消息

          //若有意見和建議請E_Mail:Kingron@163.net





          type

          TFindCallBack=procedure (const filename:string;const info:TSearchRec;var bQuit,bSub:boolean);



          procedure FindFile(var quit:boolean;const path: String;const filename:string='*.*';

          proc:TFindCallBack=nil;bSub:boolean=true;const bMsg:boolean=true);

          var

          fpath: String;

          info: TsearchRec;



          procedure ProcessAFile;

          begin

          if (info.Name<>'.') and (info.Name<>'..') and ((info.Attr and faDirectory)<>faDirectory) then

          begin

          if assigned(proc) then

          proc(fpath+info.FindData.cFileName,info,quit,bsub);

          end;

          end;



          procedure ProcessADirectory;

          begin

          if (info.Name<>'.') and (info.Name<>'..') and ((info.attr and fadirectory)=fadirectory) then

          findfile(quit,fpath+info.Name,filename,proc,bsub,bmsg);

          end;



          begin

          if path[length(path)]<>'\' then

          fpath:=path+'\'

          else

          fpath:=path;

          try

          if 0=findfirst(fpath+filename,faanyfile and (not fadirectory),info) then

          begin

          ProcessAFile;

          while 0=findnext(info) do

          begin

          ProcessAFile;

          if bmsg then application.ProcessMessages;

          if quit then

          begin

          findclose(info);

          exit;

          end;

          end;

          end;

          finally

          findclose(info);

          end;

          try

          if bsub and (0=findfirst(fpath+'*',faanyfile,info)) then

          begin

          ProcessADirectory;

          while findnext(info)=0 do

          ProcessADirectory;

          end;

          finally

          findclose(info);

          end;

          end;

          例子:

          procedure aaa(const filename:string;const info:tsearchrec;var quit,bsub:boolean);

          begin

          form1.listbox1.Items.Add(filename);

          quit:=form1.qqq;

          bsub:=form1.checkbox1.Checked;

          end;



          procedure TForm1.Button1Click(Sender: TObject);

          begin

          listbox1.Clear;

          qqq:=false;

          button1.Enabled:=false;

          findfile(qqq,edit1.text,edit2.text,aaa,checkbox1.checked,checkbox2.checked);

          showmessage(inttostr(listbox1.items.count));

          button1.Enabled:=true;

          end;



          procedure TForm1.Button2Click(Sender: TObject);

          begin

          qqq:=true;

          end;


          posted on 2010-02-25 15:31 Ke 閱讀(996) 評論(0)  編輯  收藏 所屬分類: delphi
          主站蜘蛛池模板: 同仁县| 乐业县| 原阳县| 徐汇区| 阿尔山市| 灵石县| 定边县| 秀山| 沙田区| 鄂伦春自治旗| 当雄县| 曲麻莱县| 伽师县| 奈曼旗| 左云县| 合作市| 林甸县| 鄂托克旗| 黄山市| 隆尧县| 南部县| 那曲县| 上蔡县| 邓州市| 缙云县| 无为县| 施甸县| 醴陵市| 太谷县| 永胜县| 新巴尔虎左旗| 马公市| 鄂托克前旗| 弥勒县| 昌平区| 呼玛县| 政和县| 黄冈市| 婺源县| 聊城市| 建瓯市|