• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            vc文件復制和刪除及移動和重命名

            VC 移動,復制,刪除文件(SHFileOperation)

            總結(jié)一下SHFileOperation的用法,希望對大家有用

            //刪除文件或者文件夾
            bool DeleteFile(char * lpszPath)
            {
            SHFILEOPSTRUCT FileOp={0};
            FileOp.fFlags = FOF_ALLOWUNDO |   //允許放回回收站
                  FOF_NOCONFIRMATION; //不出現(xiàn)確認對話框
            FileOp.pFrom = lpszPath;
            FileOp.pTo = NULL;      //一定要是NULL
            FileOp.wFunc = FO_DELETE;    //刪除操作
            return SHFileOperation(&FileOp) == 0;
            }

            //復制文件或文件夾
            bool CopyFile(char *pTo,char *pFrom)
            {
            SHFILEOPSTRUCT FileOp={0};
            FileOp.fFlags = FOF_NOCONFIRMATION|   //不出現(xiàn)確認對話框
                  FOF_NOCONFIRMMKDIR ; //需要時直接創(chuàng)建一個文件夾,不需用戶確定
            FileOp.pFrom = pFrom;
            FileOp.pTo = pTo;
            FileOp.wFunc = FO_COPY;
            return SHFileOperation(&FileOp) == 0;
            }

            //移動文件或文件夾
            bool MoveFile(char *pTo,char *pFrom)
            {
            SHFILEOPSTRUCT FileOp={0};
            FileOp.fFlags = FOF_NOCONFIRMATION|   //不出現(xiàn)確認對話框
                  FOF_NOCONFIRMMKDIR ; //需要時直接創(chuàng)建一個文件夾,不需用戶確定
            FileOp.pFrom = pFrom;
            FileOp.pTo = pTo;
            FileOp.wFunc = FO_MOVE;
            return SHFileOperation(&FileOp) == 0;   
            }


            //從命名文件或文件夾
            bool ReNameFile(char *pTo,char *pFrom)
            {
            SHFILEOPSTRUCT FileOp={0};
            FileOp.fFlags = FOF_NOCONFIRMATION;   //不出現(xiàn)確認對話框
            FileOp.pFrom = pFrom;
            FileOp.pTo = pTo;
            FileOp.wFunc = FO_RENAME;
            return SHFileOperation(&FileOp) == 0;   
            }

            應用舉例:
            DeleteFile("d:\\PID\0\0");    //刪除一個文件夾
            DeleteFile("d:\\PID.dsp\0d:\\PID.dsw\0\0"); //刪除多個文件
            CopyFile("d:\0\0","D:\\MyProjects\\臨時程序\0\0");    //把"臨時程序"文件夾放到d盤下面
            CopyFile("d:\0\0","D:\\MyProjects\\臨時程序\\PID.dsp\0D:\\MyProjects\\臨時程序\\PID.dsw\0"); //把PID.dsp和PID.dsw倆個文件放到d盤下面
            ReNameFile("d:\\NewName","d:\\PID\0\0"); \\把PID文件夾從命名為NewName
            注意:,如果你想把"D:\\MyProjects\\臨時程序\0\0"的文件夾復制到D盤下,并從命名為NewName,應該這樣
            CopyFile("d:\\NewName\0\0","D:\\MyProjects\\臨時程序\\*.*\0\0"); //把"臨時程序"文件夾復制到d盤下并從命名為"NewName"  

             

            下面這個類方便你復制多個文件或文件夾,僅作參考
            //連接多個路徑的類
            class JOINFILEPATH
            {
            private:
            int pos;
            char* MultipleFilePath;
            public:
            JOINFILEPATH()
            {
               pos=0;
               MultipleFilePath=new char[MAX_PATH*10];
               memset(MultipleFilePath,0,MAX_PATH*10);
            }
            ~JOINFILEPATH() { delete []MultipleFilePath; }
            void join(char *FilePath)
            {
               while(*FilePath!='\0')
                MultipleFilePath[pos++]=*FilePath++;
               pos++;
            }
            char * GetMultipleFilePath() {return MultipleFilePath;}
            };

            //應用舉例:
            JOINFILEPATH FilePath;
            FilePath.join("D:\\MyProjects\\臨時程序\\PID\\PID.dsp");
            FilePath.join("D:\\MyProjects\\臨時程序\\PID\\PID.dsw");
            CopyFile("d:\0\0",FilePath.GetMultipleFilePath());

            1 pFrom和pTo最好以\0\0結(jié)尾(把存放路徑的字符串初始化為0),不然有可能會出錯,中間的每一個路徑用\0隔開
            2 pFrom所指向的文件或文件夾(可以多個)會被復制或移動到pTo所指向的文件夾下面(假如文件夾不存在會詢問是否創(chuàng)建,當然你也可以選擇直接創(chuàng)建)

            參數(shù)詳解:

            Typedef struct _ShFILEOPSTRUCT
            {
            HWND hWnd; //消息發(fā)送的窗口句柄;
            UINT wFunc; //操作類型
            LPCSTR pFrom; //源文件及路徑
            LPCSTR pTo; //目標文件及路徑
            FILEOP_FLAGS fFlags; //操作與確認標志
            BOOL fAnyOperationsAborted; //操作選擇位
            LPVOID hNameMappings; //文件映射
            LPCSTR lpszProgressTitle; //文件操作進度窗口標題
            }SHFILEOPSTRUCT, FAR * LPSHFILEOPSTRUCT;

              在這個結(jié)構(gòu)中,hWnd是指向發(fā)送消息的窗口句柄,pFrom與pTo是進行文件操作的源文件名和目標文件名,它包含文件的路徑,對應單個文件的路徑字符串,或?qū)τ诙鄠€文件,必須以NULL作為字符串的結(jié)尾或文件路徑名之間的間隔,否則在程序運行的時候會發(fā)生錯誤。另外,pFrom和pTo都支持通配符*和?,這大大方便了開發(fā)人員的使用。例如,源文件或目錄有兩個,則應是:char pFrom[]="d:\\Test1\0d:\\Text.txt\0",它表示對要D:盤Test目錄下的所有文件和D:盤上的Text.txt文件進行操作。字符串中的"\\"是C語言中的'\'的轉(zhuǎn)義符,'\0'則是NULL。wFunc 是結(jié)構(gòu)中的一個非常重要的成員,它代表著函數(shù)將要進行的操作類型,它的取值為如下:

              FO_COPY: 拷貝文件pFrom到pTo 的指定位置。

              FO_RENAME: 將pFrom的文件名更名為pTo的文件名。

              FO_MOVE: 將pFrom的文件移動到pTo的地方。

              FO_DELETE: 刪除pFrom指定的文件。

              使用該函數(shù)進行文件拷貝、移動或刪除時,如果需要的時間很長,則程序會自動在進行的過程中出現(xiàn)一個無模式的對話框(Windows操作系統(tǒng)提供的文件操作對話框),用來顯示執(zhí)行的進度和執(zhí)行的時間,以及正在拷貝、移動或刪除的文件名,此時結(jié)構(gòu)中的成員lpszProgressTitle顯示此對話框的標題。fFlags是在進行文件操作時的過程和狀態(tài)控制標識。它主要有如下一些標識,也可以是其組合:

              FOF_FILESONLY:執(zhí)行通配符,只執(zhí)行文件;

              FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢復文件;

              FOF_NOCONFIRMATION:在出現(xiàn)目標文件已存在的時候,如果不設(shè)置此項,則它會出現(xiàn)確認是否覆蓋的對話框,設(shè)置此項則自動確認,進行覆蓋,不出現(xiàn)對話框。

              FOF_NOERRORUI:設(shè)置此項后,當文件處理過程中出現(xiàn)錯誤時,不出現(xiàn)錯誤提示,否則會進行錯誤提示。

              FOF_RENAMEONCOLLISION:當已存在文件名時,對其進行更換文提示。

              FOF_SILENT:不顯示進度對話框。

              FOF_WANTMAPPINGHANDLE:要求SHFileOperation()函數(shù)返回正處于操作狀態(tài)的實際文件列表,文件列表名柄保存在hNameMappings成員中。

              SHFILEOPSTRUCT結(jié)構(gòu)還包含一個SHNAMEMAPPING結(jié)構(gòu)的數(shù)組,此數(shù)組保存由SHELL計算的每個處于操作狀態(tài)的文件的新舊路徑。

              在使用該函數(shù)刪除文件時必須設(shè)置SHFILEOPSTRUCT結(jié)構(gòu)中的神秘FOF_ALLOWUNDO標志,這樣才能將待刪除的文件拷到Recycle Bin,從而使用戶可以撤銷刪除操作。需要注意的是,如果pFrom設(shè)置為某個文件名,用FO_DELETE標志刪除這個文件并不會將它移到Recycle Bin,甚至設(shè)置FOF_ALLOWUNDO標志也不行,在這里你必須使用全路徑名,這樣SHFileOperation才會將刪除的文件移到Recycle Bin。

            轉(zhuǎn)自http://blog.csdn.net/jhb92/archive/2007/04/13/1563452.aspx

            Shell的文件操作函數(shù)
            SHFileOperation
            功能:
            1.復制一個或多個文件
            2.刪除一個或多個
            3.重命名文件
            4.移動一個或多個文件

            有一樣的Win32API功能函數(shù)是:
            CopyFile(),DeleteFile(),MoveFile()
            MoveFile可以對文件重命名!
            Win32 API 的層次比SHFileOperation低

            SHFileOperation
            的重要參數(shù)
            1.wFunc //對pFrom pTo要執(zhí)行的操作
            2.fFlags //影響對wFunx的操作
            3.hNameMappings   //有系統(tǒng)填充,和你也可以填充
            4.lpszProgressTitle

            pFrom pTo 在結(jié)尾是兩個'\0\0'
            通常用一個'\0',這樣會失敗的!!
            當FOF_MULTIDESTFILES
            szPFrom[lstrlen(szPFrom)+1]=0

            szPFrom:必須先確定他所指定的文件存在!
            可以是單個文件名,*.*,或包含統(tǒng)配符的文件名
            注意必須是文件名,不是文件所在的文件夾名
            szSource:可以是一個目錄,如果不是目錄,但又有
            多個文件,那么必須和szPFrom的每一個文件對應,還要指定
            FOF_MULTIDETFILES標志


            Source and Target
            多個文件---> 一個文件夾
            許多單獨的文件---->一個文件夾
            單獨文件--->單獨文件
            許多單獨的文件---->許多單獨的文件

            單獨文件:知道名字的文件
            多個文件:帶有統(tǒng)配符的文件
            注意到source中沒有對文件夾的操作!!


            !!!!
            SHFileOperation能操作網(wǎng)絡上的文件
            如果你想將本地文件復制到192.168.1.99
            那么只要在192.168.1.99上共享123目錄
            然后將pTo設(shè)置為\\192.168.1.99\123
            就可以了
            但不要設(shè)置為\\192.168.1.99


            對hNameMappings操作是Undocumented!!
            如果沒有指定hNameMappings
            那么hNameMappings一直是NULL
            只有當某種操作(copy,move,rename)引起了文件名沖突了,hNameMappings才不是NULL!!!
            當?shù)谝淮蝐opy某些文件到空目錄中時hNameMappings一定是NULL
            所以hNameMappings只是內(nèi)存中的一塊地區(qū)用來讓Explorer.exe保存被重命名的文件,以避免文件名沖突!
            上面知道了如何才能使hNameMappings有效
            現(xiàn)在如何使用hNameMappings,及其所指的結(jié)構(gòu)大小?并取得這個內(nèi)存塊的內(nèi)容呢?
            hNameMappings 是簡單LPVOID無法使用loop
            要使用hNameMappings,必須定義一個結(jié)構(gòu)體
            struct HANDLETOMAPPINGS {
                UINT              uNumberOfMappings; // number of mappings in array
                LPSHNAMEMAPPING   lpSHNameMapping;    // pointer to array of mappings
            };
            但是可以寫一個Enumerate function to enumerate lpSHNameMapping指向的內(nèi)存塊,并且是讓Window自己調(diào)用我的,不是我主動調(diào)用,象Loop

            相關(guān)聯(lián)接:
            Q154123:File Name Mapping with Windows NT 4.0 Shell
            Q133326:SHFILEOPSTRUCT pFrom and pTo Fields Incorrect
            Q142066:PRB: SHGetNameMappingPtr() and SHGetNameMappingCount()
            Manipulating Files with the SHFileOperation Function in Visual Basic 4.0

             

            FOF_SILENT //不產(chǎn)生正在復制的對話框
            FOF_NOCONFIRMMKDIR//如果目的目錄不存在,就默認創(chuàng)建
            FOF_NOCONFIRMATION //不出現(xiàn)確認文件替換對話框(Confirmation Dialog)(默認替換原來的文i件)
            FOF_NOERRORUI//不出現(xiàn)錯誤對話框
            最好不要同時使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
            因為FOF_NOCONFIRMMKDIR屏蔽了missing directory Error
            但FOF_NOERROR又屏蔽了missing directory Error,那么在同時使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
            時也阻止了新目錄安靜(沒有用戶確認要產(chǎn)生新目錄的對話框)的產(chǎn)生!!
            那么如何同時使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR?
            就必須先確認pTo所指定的目錄存在即可
            BOOL MakeSureDiretoryPathExists(LPCSTR DirPath);

            使用它要包含imagehlp.h和imagehlp.lib
            如何判斷同時存在FOF_NOERRORUI,FOF_NOCONFIRMMKDIR


            FOF_RENAMEONCOLLISION//有重復文件時自動重命名


            能產(chǎn)生對話框的標志:
            FOF_SILENT             //progress dialog           
            FOF_RENAMEONCOLLISION //replace dialog
            FOF_NOCONFIRMATION     //confirmation dialog
            FOF_NOCONFIRMMKDIR     //asks for your permission to create a new folder
            FOF_NOERRORUI          //error message


            FOF_ALLOWUNDO     //將文件放入回收站,否則直接刪除,一般這個最好做默認

            posted on 2010-08-16 10:31 wrh 閱讀(3135) 評論(0)  編輯 收藏 引用

            導航

            <2008年4月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            統(tǒng)計

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            色8久久人人97超碰香蕉987| 青青青青久久精品国产| 国产午夜福利精品久久| 久久久精品午夜免费不卡| 久久久久99精品成人片三人毛片| 久久综合九色综合久99| 日日狠狠久久偷偷色综合免费| 伊人色综合九久久天天蜜桃| 亚洲av伊人久久综合密臀性色| AV无码久久久久不卡蜜桃 | 色综合久久无码五十路人妻| 精品国产乱码久久久久久1区2区| 99热都是精品久久久久久| 久久久黄片| 久久国产精品一区二区| 久久精品国产男包| 国产一级做a爰片久久毛片| 亚洲午夜久久久| 国产成人精品久久亚洲高清不卡| 99久久精品国产一区二区| 国产高潮久久免费观看| 日本人妻丰满熟妇久久久久久| 久久精品成人免费观看97| 精品久久久久久久无码| 97精品依人久久久大香线蕉97| 久久国产精品二国产精品| 九九久久99综合一区二区| 人妻无码精品久久亚瑟影视| 久久99久久成人免费播放| 久久精品国产精品青草app| 无码人妻精品一区二区三区久久| 久久综合九色综合欧美就去吻| 国产精品久久久99| 99久久精品免费| 色综合色天天久久婷婷基地| 久久国产精品99精品国产987| 精品国产乱码久久久久久郑州公司 | 久久亚洲中文字幕精品一区四| 亚洲国产精品久久66| 国产午夜精品久久久久免费视| 久久妇女高潮几次MBA|