vs實現檔案拷貝 刪除 移動 更名

2021-09-26 11:39:05 字數 3919 閱讀 3033

在windows的shellapi檔案中定義了乙個名為shfileoperation()的外殼函式,它可以用來實現各種檔案操作,例如檔案的拷貝、刪除和移動等,該函式使用起來非常簡單,它只有乙個指向shfileopstruct結構的引數。使用shfileoperation()函式時只要填寫該專用結構--shfileopstruct,告訴windows執行什麼樣的操作,以及其它重要資訊就行了。shfileoperation()的特別之處在於它是乙個高階外殼函式,不同於低階檔案處理。當呼叫shfileoperation操作檔案時,相應的外殼拷貝處理器(如果有的話)被呼叫。如在刪除某個檔案時,shfileoperation會將刪除的檔案放到recycle bin中。

shfileoperation()函式原型為:winshellapi int winapi shfileoperation(lpshfilestruct lpfileop);

使用前**載檔案庫:#include "shlwapi.h"

lpshfilestruct結構格式如下:

typedef struct _shfileopstruct

hwnd  hwnd;  //訊息傳送的視窗控制代碼;

uint   wfunc;  //操作型別

lpcstr  pfrom;   //原始檔以及路徑

lpcstr  pto;    //目標檔案以及路徑

fileop_flags  fflags;  //操作選擇位

lpcstr  lpszprogresstitle;  //檔案操作進度視窗標題

}shfileopstruct,far* lpshfileopstruct;

在這個結構中,hwnd是指向傳送訊息的視窗控制代碼,pfrom與pto是進行檔案操作的源檔名和目標檔名,它包含檔案的路徑,對應單個檔案的路徑字串,或對於多個檔案,必須以null作為字串的結尾或檔案路徑名之間的間隔,否則在程式執行的時候會發生錯誤。另外,pfrom和pto都支援萬用字元*和?,這大大方便了開發人員的使用。例如,原始檔或目錄有兩個,則應是:char pfrom="d:/test1/0d:/text.txt/0",它表示對要d:盤test1目錄下的所有檔案和d:盤上的text.txt檔案進行操作。字串中的""是c語言中的''的轉義符,'/0'則是null。wfunc 是結構中的乙個非常重要的成員,它代表著函式將要進行的操作型別,它的取值為如下: 

·fo_copy: 拷貝檔案pfrom到pto 的指定位置。 

·fo_rename: 將pfrom的檔名更名為pto的檔名。 

·fo_move: 將pfrom的檔案移動到pto的地方。 

·fo_delete: 刪除pfrom指定的檔案。 

同時也有乙個重要的應用就是:

在進行檔案操作時,可以使用cfile類中的remove()函式來刪除乙個檔案,但是這樣的操作將永久性的刪除該檔案,不能在必要的時候再恢復該檔案,解決這個問題的唯一方法就是把檔案送到windows系統中的**站(recycle bin)裡面,而不是簡單的永久性刪除它,這樣使用者就可以在必要的時候恢復這個檔案。用這個函式實現程式設計來實現windows**站的檔案訪問操作。

在使用該函式刪除檔案時必須設定shfileopstruct結構中的神秘fof_allowundo標誌,這樣才能將待刪除的檔案拷到recycle bin,從而使使用者可以撤銷刪除操作。需要注意的是,如果pfrom設定為某個檔名,用fo_delete標誌刪除這個檔案並不會將它移到recycle bin,甚至設定fof_allowundo標誌也不行,在這裡你必須使用全路徑名,這樣shfileoperation才會將刪除的檔案移到recycle bin。

**如下:

標誌

抑制的對話方塊

相關性與優先順序

fof_multidestfiles無無

fof_filesonly無無

fof_silent

如果設定,進度對話方塊不顯示。

優先於fof_******progress標誌。

fof_******progress

無為fof_silent標誌所抑制。

fof_renameoncollision

如果設定了這個標誌,當被移動或拷貝的檔案與已存在檔案同名時置換對話方塊不會出現。

名字衝突時,如果fof_noconfirmation標誌設定,則操作繼續。

如果二者都設定了,則它優先於fof_noconfirmation。即,檔案以給定的新名字複製,而不是覆蓋。

fof_noconfirmation

如果設定,確認對話方塊在任何情況下都不出現。

名字衝突時,引起檔案覆蓋,除非設定了fof_renameoncollision標誌。

fof_noconfirmmkdir

抑制請求建立新資料夾的對話方塊

預設目錄作為嚴重錯誤產生乙個錯誤訊息框。

建立目錄的確認對話方塊作為錯誤訊息框是否顯示依賴於fof_noerrorui的設定。

fof_noerrorui

抑制所有錯誤訊息框。

優先於前乙個標誌。如果設定,則,預設目錄引起不被處理的異常,並且返回錯誤碼。

標誌

描述

fof_silent

0x0004

這個操作不回饋給使用者,就是說,不顯示進度對話方塊。相關的訊息框仍然顯示。

fof_noconfirmation

0x0010

這個標誌使函式對任何遇到的訊息框都自動回答yes。

fof_allowundo

0x0040

如果設定,這個標誌強迫函式移動被刪除的檔案到『**站』中。否則,檔案將被物理地從磁碟上刪除。

fof_filesonly

0x0080

設定這個標誌導致函式僅僅刪除檔案,跳過目錄項。它僅僅應用於指定萬用字元的情況。

fof_******progress

0x0100

這導致簡化使用者介面。使之只有動畫而不報告被刪除的檔名。代之的是顯示lpszprogresstitle成員中指定的文字。(win7實際中貌似不可用)

fof_noerrorui

0x0400

如果設定了這個標誌,任何發生的錯誤都不能使訊息框顯示,而是程式中返回錯誤碼。

這裡出現的標誌最要緊的是fof_allowundo,它決定檔案是否一次就全部刪除,或儲存到『**站』中等候可能的恢復。如果fof_allowundo被設定,檔案則被移動到**站,並且這個操作可以被undo(儘管可以手動undo)。undo特徵僅在刪除下可用,在拷貝與移動中沒有等價的操作。

msdn資料中說明,shfileoperation()在成功時返回0,失敗時返回非0值。顯然這是真的,但並不是最有用的解釋。重複測試這個函式,可以確信它有非常多的終止方式。事實上,我們經常在系統錯誤的提示中執行,在有些地方這個函式只是簡單地返回從更靠近檔案系統的其它程式中獲得的返回碼。下面列表給出了shfileoperation()返回的最通常的部分錯誤。 

錯誤碼

描述

如果你試圖重新命名多重檔案,這個訊息就會出現。描述是相當直接的:系統不能找到指定的檔案。

在詢問是否想要置換給定檔案時,你回答了『取消』,函式就返回這個錯誤碼。它的描述也是相當的不明確—儲存控制塊被銷毀。

在試圖重新命名檔案到不同的資料夾時,發生這個檔案系統錯。重新命名檔案只是改變檔名,而不能改變資料夾。

乙個ioctl錯(輸入/輸出控制),在目的路徑中有錯誤時或取消了新目錄的建立時,這個錯誤發生了。

你正在試圖重新命名乙個檔案,然而你給出的名字是乙個已經存在的檔案。它也有乙個無用的描述:檔名,目錄名,或捲標號的語法是不正確的。

在試圖移動或拷貝乙個不存在的檔案時,出現這個檔案系統錯。一般地,它提示了,源緩衝中的某些東西應該修改一下。這個錯誤碼彈出乙個的錯誤框,你可以通過設定fof_noerrorui標誌抑制它的顯示。

Linux檔案建立 刪除 拷貝 移動

建立檔案命令 touch 建立的是沒有任何內容的空檔案。如在當前目錄建立沒有任何內容的空檔案 touch empty 注意事項 如果建立的檔案已經存在的話,touch檔案將會改變這個檔案的時間撮屬性,也即檔案的最後修改時間屬性 拷貝檔案 用法 cp 選項 要拷貝的檔案 檔案列表 目的檔名 目的目錄 ...

Shell命令 mv 命令 更名或移動檔案

linux mv命令用來為檔案或目錄改名 或將檔案或目錄移入其它位置。mv引數設定與執行結果 命令格式 執行結果 mv 檔名 檔名 將源檔名改為目標檔名 mv 檔名 目錄名 將檔案移動到目標目錄v mv 目錄名 目錄名 目標目錄已存在,將源目錄移動到目標目錄 目標目錄不存在則改名 mv 目錄名 檔名...

linux常用命令之移動,拷貝,刪除檔案

linux下移動命令是mv move的縮寫 可以用來移動檔案或者將檔案改名。命令格式 mv 選項 原始檔或目錄 目標檔案或目錄 將檔案log1.txt,log2.txt,log3.txt移動到目錄test3中 mv log1.txt log2.txt log3.txt test3 將檔案a.txt,...