mFC下檔案的遞迴刪除和拷貝

2021-06-07 23:07:56 字數 4862 閱讀 7520

mfc 中 刪除乙個非空資料夾 (mfc 檔案操作 一)

分類: c/c++ 程式開發

2010-08-01 16:50

1107人閱讀

(1)收藏舉報

mfc中提供了刪除資料夾的乙個封裝函式 removedirectory(lpctstr lppathname),我們只要把要刪除的資料夾的路徑傳進去就可以刪除了,貌似一切如此簡單。我象徵性的建立乙個資料夾,然後在程式中刪除了它,呵呵,一下就成功了。正當我要轉手去做另外的操作時,我喜歡亂嘗試的毛病就鬼使神差的讓我做了這麼一件事,在這個資料夾下我新增了幾個新的子資料夾以及一些檔案,這下我再試我的程式時就出現問題了,刪不掉了!!

原來-------removedirectory(lpctstr lppathname)欺騙了我,他只能刪除空的資料夾,這下我有問題了,怎麼才能刪除乙個資料夾,即便其中含有無數的子檔案和子資料夾呢?

removedirectory(lpctstr lppathname) 的這種行為其實是情有可原的,它為我們的操作提供了一種安全級別的控制。

但我現在就想刪除非空資料夾 , 怎麼辦呢????

遞迴刪除!!

看到論壇上有人提出這一思想,我感覺很有道理,於是就基於這一思想,著手實現它!

首先將資料夾下所有內容刪除,再呼叫removedirectory(lpctstr lppathname)不就可以實現了麼!!

為此我專門寫了乙個函式來遞迴刪除乙個資料夾下的所有內容!

請看我的**

[cpp]view plain

copy

print?

voidmydeletedirectory(cstring directory_path)   //刪除乙個資料夾下的所有內容

else

}  }  

定義乙個 cfilefind 類物件 來找資料夾下的所有子檔案和子資料夾,然後依次判斷它是 檔案 還是 資料夾,

如果是檔案 就直接刪除了,如果是資料夾就遞迴呼叫 該 mydeletedirectory()函式,來刪除其內容。然後在呼叫removedirectory()來刪除這個資料夾,這樣不就好了麼?

為了測試我的程式是否是正確的,我建立了乙個資料夾 forvctest,在其中新增了許多的子檔案和資料夾,又在子資料夾中新增了檔案和資料夾。寫了這麼一段測試程式,諸位請看:

[cpp]view plain

copy

print?

voiddeletealldirectory() //刪除資料夾  包括非空的資料夾

測試結果出來了,我眼看著乙個內容豐富的資料夾,就在我的程式執行後消失了!真是很舒心啊!呵呵!

在實現檔案複製過程時,乙個問題i是我糾結了許久,cfilefind 類的成員函式 getfilepath()與getfilename(),其實很好理解的兩個函式,乙個是獲得檔案的路徑,乙個是獲得檔案的名字。但我卻在理解上犯了乙個錯誤,就是檔案路徑究竟包不包含檔案名字,如有檔案c:/test/1.txt ,那麼它的路徑和名稱分別是什麼?我理解成了,路徑:c:/test 名稱1.txt ,我按照我的理解編寫這個複製功能的實現**,老師出錯,最後我才發現,原來 路徑是包含檔名稱的 ,即上面的檔案 路徑即是:c:/test/1.txt。

似乎是個很低階的錯誤,但是的確困擾了我一段時間。

回到正題。

請看源**: 

[cpp]view plain

copy

print?

voidmycopydirectory(cstring source, cstring target)  

else

}  }  

源**不是很難理解,不再詳解

一、 從路徑中 提取副檔名

[c-sharp]view plain

copy

print?

cstring path("c:/forvctest/diary.txt"

);  

cstring ext = path.mid(path.reversefind('.'

)+1);  

afxmessagebox(ext);  

解析:1. cstring::mid

cstring mid(int nfirst) const;

cstring mid(int nfirst,int ncount) const;

ncount代表要提取的字元數,nfirst代表要提取的開始位置

2. cstring::cstring::reversefind

int reversefind( tchar ch ) const;

返回值返回此cstring 物件中與要求的字元匹配的最後乙個字元的索引;如果沒有找 到需要的字元則返回-1。

引數ch 要搜尋的字元

3. 從檔案路徑中找到 ' . '的位置,然後索引後移乙個即是字尾名的起始字元的索引

利用mid函式提取出 字尾名

二、從路徑中 提取檔名

[c-sharp]view plain

copy

print?

cstring path("c:/forvctest/diary.txt"

);  

cstring name = path.mid(path.reversefind('/'

)+1);  

afxmessagebox(name);  

三、獲取檔案屬性

[c-sharp]view plain

copy

print?

dword dwattr = getfileattributes("c:/forvctest/2.txt"

);//獲取檔案的屬性

if(dwattr == file_attribute_archive)  

四、設定檔案屬性

[c-sharp]view plain

copy

print?

setfileattributes("c:/forvctest/2.txt"

,file_attribute_readonly);//|file_attribute_hidden  

五、獲取當前程式所在路徑

[cpp]view plain

copy

print?

//提取檔案路徑

char

afxmessagebox(szpath);  

解析:dword winapi getmodulefilename(

__in_opt hmodule hmodule,

__out lptstr lpfilename,

__in dword nsize);

返回包含指定模組的檔案的全路徑,這個模組必須是已經被當前程序載入的。

六、移動檔案

[c-sharp]view plain

copy

print?

movefile("c:/forvctest/diary.txt"

,"c:/forvctest/newcopy.txt"

);  

移動後 原始檔被刪除,目標檔案被建立

七、path name title 的區別

[c-sharp]view plain

copy

print?

cfile file("c:/forvctest/newcopy.txt"

,cfile::moderead);  

cstring szpath = file.getfilepath();  

cstring szname = file.getfilename();  

cstring sztitle = file.getfiletitle();  

afxmessagebox("szpath = "

+szpath);  

afxmessagebox("szname = "

+szname);  

afxmessagebox("sztitle = "

+sztitle);  

我寫了上面一段測試程式,得到的結果是

szpath = "c:/forvctest/newcopy.txt"

szname = "newcopy.txt"

sztitle = "newcopy.txt"

msdn 裡面說 title 是 newcopy  但是我的執行結果和它講的不一樣。

這裡我就不是很明白了,這後兩個概念到底有什麼區別?

我又研究了一番,終於發現了他們的區別。

如果將檔案的字尾名 隱藏以來,你就發現,name = newcopy.txt  而 title = newcopy

這就是區別吧。

希望看這篇文章的博友能和我一起交流討論這個問題。

八、檔案分隔

[c-sharp]view plain

copy

print?

boolsplitfile()   

m_file.close();  

}else

return

true;  

}  

mfc下檔案的基本操作

1 檔案的查詢 當對乙個檔案操作時,如果不知道該檔案是否存在,就要首先進行查詢。mfc中有乙個專門用來進行檔案查詢的類cfilefind,使用它可以方便快捷地進行檔案的查詢。下面這段 演示了這個類的最基本使用方法。cstring strfiletitle cfilefind finder bool ...

遞迴刪除檔案和刪除資料夾

path f software phpstudy www ico web node modules 自定義的刪除函式,可以刪除檔案和遞迴刪除資料夾 scandir 返回指定目錄中的檔案和目錄的陣列。function my del path rmdir path 這種方法不用判斷資料夾是否為空,因為不...

遞迴刪除資料夾跟拷貝資料夾

刪除檔案 存在檔案則直接刪除返回true,如果不存在返回false 刪除目錄 為空 直接刪除 不為空 刪不掉 需要先刪除資料夾裡面所有檔案,再刪除資料夾 不存在直接返回false 注意 delete方法 直接從磁碟中刪除,不能像 站一樣可以恢復 遞迴拷貝資料夾 param oldfile 源資料夾 ...