




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、VC+文件操作之最全篇 一、剖析VC中的文件操作 各種關(guān)于文件的操作在程序設(shè)計中是十分常見,如果能對其各種操作都了如指掌,就可以根據(jù)實際情況找到最佳的解決方案,從而在較短的時間內(nèi)編寫出高效的代碼,因而熟練的掌握文件操作是十分重要的。本文將對Visual C+中有關(guān)文件操作進(jìn)行全面的介紹,并對在文件操作中經(jīng)常遇到的一些疑難問題進(jìn)行詳細(xì)的分析。1文件的查找當(dāng)對一個文件操作時,如果不知道該文件是否存在,就要首先進(jìn)行查找。MFC中有一個專門用來進(jìn)行文件查找的類CFileFind,使用它可以方便快捷地進(jìn)行文件的查找。下面這段代碼演示了這個類的最
2、基本使用方法。C+代碼1. CString strFileTitle; 2. CFileFind finder; 3. BOOL bWorking = finder.FindFile("C:/windows/sysbkup/*.cab"); 4. while(bWorking) 5. 6. bWorking=finder.FindNextFile
3、(); 7. strFileTitle=finder.GetFileTitle(); 8. 2文件的打開/保存對話框 讓用戶選擇文件進(jìn)行打開和存儲操作時,就要用到文件打開/保存對話框。MFC的類CFileDialog用于實現(xiàn)這種功能。使用CFileDialog 聲明一個對象時,第一個BOOL型參數(shù)用于指定文件的打開或保存,當(dāng)為TRUE時將構(gòu)造一個文件打開對話框,為FALSE時構(gòu)造一個文件保存對話框。 在構(gòu)造CFileDialog
4、對象時,如果在參數(shù)中指定了OFN_ALLOWMULTISELECT風(fēng)格,則在此對話框中可以進(jìn)行多選操作。此時要重點 注意為此CFileDialog對象的m_ofn.lpstrFile分配一塊內(nèi)存,用于存儲多選操作所返回的所有文件路徑名,如果不進(jìn)行分配或分配的內(nèi) 存過小就會導(dǎo)致操作失敗。下面這段程序演示了文件打開對話框的使用方法。C+代碼1. CFileDialog mFileDlg(TRUE,NULL,NULL, 2. OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
5、 3. "All Files (*.*)|*.*|",AfxGetMainWnd(); 4. CString str(" ",10000); 5. mFileDlg.m_ofn.lpstrFile=str.GetBuffer(10000); 6. str.ReleaseBuffer(); 7. POSITION mPos=mFileDlg.G
6、etStartPosition(); 8. CString pathName(" ",128); 9. CFileStatus status; 10. while(mPos!=NULL) 11. 12. pathName=mFileDlg.GetNextPathName(mPos); 13. CFile:GetStatus(
7、60;pathName, status ); 14. 3文件的讀寫文件的讀寫非常重要,下面將重點進(jìn)行介紹。文件讀寫的最普通的方法是直接使用CFile進(jìn)行,如文件的讀寫可以使用下面的方法:C+代碼1. /對文件進(jìn)行讀操作 2. char sRead2; 3. CFile mFile(_T("user.txt"),CFile:modeRead); 4.
8、 if(mFile.GetLength()<2) 5. return; 6. mFile.Read(sRead,2); 7. mFile.Close(); 8. /對文件進(jìn)行寫操作 9. CFile mFile(_T("user.txt "), CFile:modeWrite|CFile:modeCreate); 1
9、0. mFile.Write(sRead,2); 11. mFile.Flush(); 12. mFile.Close(); 雖然這種方法最為基本,但是它的使用繁瑣,而且功能非常簡單。我向你推薦的是使用CArchive,它的使用方法簡單且功能十分強(qiáng)大。首先還是用 CFile聲明一個對象,然后用這個對象的指針做參數(shù)聲明一個CArchive對象,你就可以非常方便地存儲各種復(fù)雜的數(shù)據(jù)類型了。它的使用方法見下例。C+代碼1. /對文件進(jìn)行寫操作 &
10、#160; 2. CString strTemp; 3. CFile mFile; 4. mFile.Open("d:/dd/try.TRY",CFile:modeCreate|CFile:modeNoTruncate|CFile:modeWrite); 5. CArchive ar(&mFile,CArchive:store);
11、60;6. ar<<ar.Close(); 7. mFile.Close(); 8. /對文件進(jìn)行讀操作 9. CFile mFile; 10. if(mFile.Open("d:/dd/try.TRY",CFile:modeRead)=0) 11. return;
12、160;12. CArchive ar(&mFile,CArchive:load); 13. ar>>strTemp; 14. ar.Close(); 15. mFile.Close(); CArchive的 << 和>> 操作符用于簡單數(shù)據(jù)類型的讀寫,對于CObject派生類的
13、對象的存取要使用ReadObject()和WriteObject()。使用 CArchive的ReadClass()和WriteClass()還可以進(jìn)行類的讀寫,如: C+代碼1. /存儲CAboutDlg類 2. ar.WriteClass(RUNTIME_CLASS(CAboutDlg); 3. /讀取CAboutDlg類 4. CRuntimeClass* mRunClass=ar.ReadClass();
14、;5. /使用CAboutDlg類 6. CObject* pObject=mRunClass->CreateObject(); 7. (CDialog* )pObject)->DoModal(); 雖然VC提供的文檔/視結(jié)構(gòu)中的文檔也可進(jìn)行這些操作,但是不容易理解、使用和管理,因此雖然很多VC入門的書上花費大量篇幅講述文檔/視結(jié)構(gòu),但我建 議你最好不要使用它的文檔。關(guān)于如何進(jìn)行文檔/視的分離有很多書介紹,包括非常著名的
15、Visual C+ 技術(shù)內(nèi)幕。 如果你要進(jìn)行的文件操作只是簡單的讀寫整行的字符串,我建議你使用CStdioFile,用它來進(jìn)行此類操作非常方便,如下例。 C+代碼1. CStdioFile mFile; 2. CFileException mExcept; 3. mFile.Open( "d:/temp/aa.bat", CFile:modeWrite, &mExcept);
16、4. CString string="I am a string." 5. mFile.WriteString(string); 6. mFile.Close(); 4臨時文件的使用 正規(guī)軟件經(jīng)常用到臨時文件,你經(jīng)常可以會看到C:/Windows/Temp目錄下有大量的擴(kuò)展名為tmp的文件,這些就是程序運行是建立的臨時文件。 臨時文件的使用方法
17、基本與常規(guī)文件一樣,只是文件名應(yīng)該調(diào)用函數(shù)GetTempFileName()獲得。它的第一個參數(shù)是建立此臨時文件的路徑,第二個 參數(shù)是建立臨時文件名的前綴,第四個參數(shù)用于得到建立的臨時文件名。得到此臨時文件名以后,你就可以用它來建立并操作文件了,如:C+代碼1. char szTempPath_MAX_PATH,szTempfile_MAX_PATH; 2. GetTempPath(_MAX_PATH, szTempPath); 3. GetTempFileName(szTempPath,_T
18、;("my_"),0,szTempfile); 4. CFile m_tempFile(szTempfile,CFile: modeCreate|CFile: modeWrite); 5. char m_char='a' 6. m_tempFile.Write(&m_char,2); 7. m_tempFile.Close();
19、160; 5文件的復(fù)制、刪除等 MFC中沒有提供直接進(jìn)行這些操作的功能,因而要使用SDK。SDK中的文件相關(guān)函數(shù)常用的有CopyFile()、CreateDirectory()、DeleteFile()、MoveFile()。它們的用法很簡單,可參考MSDN。 二、解讀VC+編程中的文件操作API和CFile類 在VC編程中,操作文件的方法主要有兩種:利用API函數(shù)和MFC的CFile類。微軟在其中封裝了文件的一般操作,下面我就介
20、紹一下如何利用這兩種方法實現(xiàn)文件操作。1創(chuàng)建或打開一個文件API函數(shù)CreateFile可打開和創(chuàng)建文件、管道、郵槽、通信服務(wù)、設(shè)備以及控制臺,但是在此時只是介紹用這個函數(shù)怎么實現(xiàn)創(chuàng)建和打開一個文件。C+代碼1. HANDLE CreateFile( 2. LPCTSTR lpFileName, / 要打開的文件名 3. DWORD dwDesiredAccess, / 文件的操作屬性 4. DWORD dwShareMod
21、e, / 文件共享屬性 5. LPSECURITY_ATTRIBUTES lpSecurityAttributes,/ 文件安全特性 6. DWORD dwCreationDisposition, /文件操作 7. DWORD dwFlagsAndAttributes, / 文件屬性 8. HANDLE hTemplateFile /
22、60;如果不為零,則指定一個文件句柄。新文件將從這個文件中復(fù)制擴(kuò)展屬性 9. ); 文件的操作屬性:如果為零,表示只允許獲取與一個設(shè)備有關(guān)的信息,GENERIC_READ 表示允許對設(shè)備進(jìn)行讀訪問;如果為 GENERIC_WRITE 表示允許對設(shè)備進(jìn)行寫訪問(可組合使用);文件的共享屬性:零表示不共享; FILE_SHARE_READ 或 FILE_SHARE_WRITE 表示允許對文件進(jìn)行讀/寫共享訪問;文件的操作有:·CREATE_NEW:創(chuàng)建文件;如文件存在則會出錯·CREATE_ALWAYS:創(chuàng)建文
23、件,會改寫前一個文件·OPEN_EXISTING:文件必須已經(jīng)存在。由設(shè)備提出要求·OPEN_ALWAYS:如文件不存在則創(chuàng)建它·TRUNCATE_EXISTING:將現(xiàn)有文件縮短為零長度文件屬性有:·FILE_ATTRIBUTE_ARCHIVE:標(biāo)記歸檔屬性·FILE_ATTRIBUTE_COMPRESSED:將文件標(biāo)記為已壓縮,或者標(biāo)記為文件在目錄中的默認(rèn)壓縮方式·FILE_ATTRIBUTE_NORMAL:默認(rèn)屬性·FILE_ATTRIBUTE_HIDDEN:隱藏文件或目錄·FILE_ATTRIBUTE_RE
24、ADONLY:文件為只讀·FILE_ATTRIBUTE_SYSTEM:文件為系統(tǒng)文件·FILE_FLAG_WRITE_THROUGH:操作系統(tǒng)不得推遲對文件的寫操作·FILE_FLAG_OVERLAPPED:允許對文件進(jìn)行重疊操作·FILE_FLAG_NO_BUFFERING:禁止對文件進(jìn)行緩沖處理。文件只能寫入磁盤卷的扇區(qū)塊·FILE_FLAG_RANDOM_ACCESS:針對隨機(jī)訪問對文件緩沖進(jìn)行優(yōu)化·FILE_FLAG_SEQUENTIAL_SCAN:針對連續(xù)訪問對文件緩沖進(jìn)行優(yōu)化·FILE_FLAG_DELETE_O
25、N_CLOSE:關(guān)閉了上一次打開的句柄后,將文件刪除。特別適合臨時文件 可以組合的屬性有:FILE_FLAG_WRITE_THROUGH,F(xiàn)ILE_FLAG_OVERLAPPED, FILE_FLAG_NO_BUFFERING,F(xiàn)ILE_FLAG_RANDOM_ACCESS, FILE_FLAG_SEQUENTIAL_SCAN,F(xiàn)ILE_FLAG_DELETE_ON_CLOSE, FILE_FLAG_BACKUP_SEMANTICS,F(xiàn)ILE_FLAG_POSIX_SEMANTICS, FILE_FLAG_OPEN_REPARSE_POINT,F(xiàn)ILE_FLAG_OPEN_NO_RECALL如
26、果成功返回一個打 開文件得句柄,如果調(diào)用函數(shù)之前文件存在,文件操作屬性為:CREATE_ALWAYS 或 OPEN_ALWAYS,使用GetLastError函數(shù)返回的是ERROR_ALREADY_EXISTS(包括函數(shù)操作成功),如果之前函數(shù)不存 在,則返回0。使用失敗返回INVALID_HANDLE_VALUE,要取得更多的信息,使用GetLastError函數(shù)。文件關(guān)閉用: BOOL CloseHandle(HANDLE hObject / handle to object to close);例子1、在當(dāng)前目錄下面
27、創(chuàng)建一個文件:C+代碼1. HANDLE handle; 2. DWORD Num; 3. handle= :CreateFile("new.tmp",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS, 4. FILE_FLAG_DELETE_ON_CLOSE,NULL); 5. if(INVALID_HANDLE_VALUE!= handle
28、0;) 6. 7. :SetFilePointer(handle,0,0,FILE_BEGIN); 8. char Buffer = "這是個剛創(chuàng)建的文件" 9. :WriteFile(handle,Buffer,sizeof(Buffer),&Num,NULL); 10. ZeroMemory(Buffer,sizeof(Buffer); 11. :SetFilePointer(handle,
29、0,0,FILE_BEGIN); 12. :ReadFile(handle,Buffer,sizeof(Buffer),&Num,NULL); 13. MessageBox(Buffer); 14. :CloseHandle(handle); 15. 可以改變上面的創(chuàng)建文件的屬性和操作看下不同效果。CFile創(chuàng)建和打開一個文件:創(chuàng)建文件和打開文件的方法有很多種,下面簡單介紹下幾個構(gòu)造函數(shù):
30、0; CFile( LPCTSTR lpszFileName, UINT nOpenFlags ); throw( CFileException ); CFile( ); BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL );lpszFileName:文件名稱,可
31、以是相對路徑,絕對路徑或網(wǎng)絡(luò)路徑nOpenFlags:打開方式有:·CFile:modeCreate 調(diào)用構(gòu)造函數(shù)構(gòu)造一個新文件,如果文件已存在,則長度變成0。·CFile:modeNoTruncate 此值與modeCreate組合使用。如果所創(chuàng)建的文件已存在則其長度不變?yōu)?。因而此文件被打開,或者作為一個新文件或者作為一個已存在的文件。這將是很有用的,例如當(dāng)打開一個可能存在也可能不存在的文件時。·CFile:modeRead 打開文件僅供讀。·CFile:modeReadWrite 打開文件供讀寫。·CFile:modeWrite 打開文件
32、僅供寫。·CFile:modeNoInherit 阻止文件被子進(jìn)程繼承。·CFile:ShareDenyNone 不禁止其它進(jìn)程讀或?qū)懺L問,打開文件。如果文件已被其它進(jìn)程以兼容模式打開,則Create失敗。·CFile:ShareDenyRead 打開文件,禁止其它進(jìn)程讀此文件。如果文件已被其它進(jìn)程以兼容模式打開,或被其它進(jìn)程讀,則Create失敗。·CFile:ShareDenyWrite 打開文件,禁止其它進(jìn)程寫此文件。如果文件已被其它進(jìn)程以兼容模式打開,或被其它進(jìn)程寫,則Create失敗。·CFile:ShareExclusive 以獨占
33、模式打開文件,禁止其它進(jìn)程對文件的讀寫。如果文件已經(jīng)以其它模式打開讀寫(即使被當(dāng)前進(jìn)程),則構(gòu)造失敗。·CFile:ShareCompat 此標(biāo)志在32位MFC中無效。此標(biāo)志在使用CFile: Open時映射為CFile:ShareExclusive。·CFile:typeText 對回車換行設(shè)置特殊進(jìn)程(僅用于派生類)。·CFile:typeBinary 設(shè)置二進(jìn)制模式(僅用于派生類)。下面給出MSDN中的一個例子:C+代碼1. char* pFileName = "test.dat" 2
34、. TRY 3. 4. CFile f( pFileName, CFile:modeCreate | CFile:modeWrite ); 5. 6. CATCH( CFileException, e ) 7. 8. #ifdef _DEBUG 9. afxDump << "File
35、60;could not be opened " << e->m_cause << "/n" 10. #endif 11. 12. END_CATCH 13. CFile fileTest; 14. char* pFileName = "test.dat"
36、; 15. TRY 16. 17. fileTest.Open(pFileName, CFile:modeCreate |CFile:modeWrite); 18. 19. CATCH_ALL(e) 20. 21. fileTest.Abort( ); 22. THROW_LAST ( ); 23. 24. END_CAT
37、CH_ALL 2文件的讀寫定位定位文件中的數(shù)據(jù)是很重要的,這決定了寫入的數(shù)據(jù)在文件中的位置。API函數(shù)C+代碼1. DWORD SetFilePointer( 2. HANDLE hFile, /文件的句柄 3. LONG lDistanceToMove, /字節(jié)偏移量r 4. PLONG lpDistanceToMoveHigh,
38、0;/指定一個長整數(shù)變量,其中包含了要使用的一個高雙字偏移(一般用來操作大型文件)。可設(shè)為零,表示只使用lDistanceToMove 5. DWORD dwMoveMethod /文件定位 6. ); dwMoveMethod文件定位的方式有三種:·FILE_BEGIN:從文件開始處。·FILE_CURRENT:從當(dāng)前位置。·FILE_END:從文件的末尾。 此函數(shù)可以用來定位大型文件,lpDistanceT
39、oMoveHigh是高32位,lDistanceToMove是低32位。如果 lpDistanceToMoveHigh為NULL時,函數(shù)操作成功,返回的是當(dāng)前文件數(shù)據(jù)的偏移量,如果lpDistanceToMoveHigh不 NULL,則返回數(shù)據(jù)的偏移量高32位放在 lpDistanceToMoveHigh中,函數(shù)調(diào)用失敗返回的是0xffffffff. BOOL SetEndOfFile(HANDLE hFile /文件的句柄);CFile類的文件數(shù)據(jù)定位函數(shù)有:
40、160; LONG Seek(LONG lOff,UINT nFrom); throw(CFileException);如果要求的位置合法,則Seek返回從文件開始起的新字節(jié)偏移量lOff:指針移動的字節(jié)數(shù)。nFrom:指針移動的模式??梢允荂File:begin,CFile:current,CFile:end void SeekToBegin( );DWORD SeekToEnd( );/返回文件長度(字節(jié)數(shù))。下面是一個讀取位圖文件的信
41、息的例子:C+代碼1. CFile file; 2. BITMAPINFOHEADER bmpinfo; 3. try 4. 5. file.Open("D:/ToolBar.bmp",CFile:modeRead); 6. file.Seek(sizeof(BITMAPFILEHEADER),CFile:begin); 7. file.Read(&bmpinfo,sizeof(BITMAPINFOHEAD
42、ER ); 8. CString str; 9. str.Format("位圖文件的長是%d,高%d",bmpinfo.biWidth,bmpinfo.biHeight); 10. MessageBox(str); 11. file.Close(); 12. 13. catch(CFileException *e) 14. 15. CString
43、;str; 16. str.Format("讀取數(shù)據(jù)失敗的原因是:%d",e->m_cause); 17. MessageBox("str"); 18. file.Abort(); 19. e->Delete(); 20. 讀取數(shù)據(jù):C+代碼1. BOOL ReadFile( 2. HANDLE hFile, /文件的句柄 &
44、#160;3. LPVOID lpBuffer, /用于保存讀入數(shù)據(jù)的一個緩沖區(qū) 4. DWORD nNumberOfBytesToRead, /要讀入的字符數(shù) 5. LPDWORD lpNumberOfBytesRead, /從文件中實際讀入的字符數(shù) 6. LPOVERLAPPED lpOverlapped /如文件打開時指定了FILE_FLAG_OVERLAPPED,那么必須,用這個參數(shù)引用一個特殊的結(jié)構(gòu)。該結(jié)
45、構(gòu)定義了一次異步讀取操作。否則,應(yīng)將這個參數(shù)設(shè)為NULL 7. ); CFile的成員函數(shù)有: UINT Read (void* lpBuf,UINT nCount); throw(CFileException);/ 返回值是傳輸?shù)骄彌_區(qū)的字節(jié)數(shù)。寫入數(shù)據(jù):C+代碼1. BOOL WriteFile( 2. HANDLE hFile,
46、0;/文件的句柄 3. LPCVOID lpBuffer, /要寫入的一個數(shù)據(jù)緩沖區(qū) 4. DWORD nNumberOfBytesToWrite, /要寫入數(shù)據(jù)的字節(jié)數(shù)量。如寫入零字節(jié),表示什么都不寫入,但會更新文件的"上一次修改時間"。 5. LPDWORD lpNumberOfBytesWritten, /實際寫入文件的字節(jié)數(shù)量 6. LPOVERLAPPED lp
47、Overlapped / OVERLAPPED,倘若在指FILE_FLAG_OVERLAPPED的前提下打開文件,這個參數(shù)就必須引用一個特殊的結(jié)構(gòu)。該結(jié)構(gòu)定義了一次異步寫操作。否則,該參數(shù)應(yīng)置為NULL 7. ); void Write(const void* lpBuf,UINT nCount); throw (CFileException);lpBuf:指向用戶提供的緩沖
48、區(qū),包含將寫入文件中的數(shù)據(jù)nCount:從緩沖區(qū)內(nèi)傳輸?shù)淖止?jié)數(shù)。對文本模式的文件,回車換行作為一個字符。下面是象一個文件中寫入數(shù)據(jù)的例子:C+代碼1. CFile file; 2. try 3. 4. file.Open("d:/my.dat",CFile:modeCreate|CFile:modeWrite); 5. file.SeekToBegin(); 6. char Data = "111111111
49、/n1111111111" 7. file.Write(Data,sizeof(Data); 8. file.Flush(); 9. file.Close(); 10. 11. catch(CFileException *e) 12. 13. CString str; 14. str.Format("讀取數(shù)據(jù)失敗的原因是:%d",e->m_cause
50、); 15. MessageBox("str"); 16. file.Abort(); 17. e->Delete(); 18. 3取得和設(shè)置文件的創(chuàng)建時間、最后訪問時間、最后寫時間C+代碼1. BOOL GetFileTime( 2. HANDLE hFile, / 文件句柄
51、160;3. LPFILETIME lpCreationTime, / 創(chuàng)建時間 4. LPFILETIME lpLastAccessTime, / 最后訪問時間 5. LPFILETIME lpLastWriteTime / 最后寫時間 6. ); 7. BOOL SetFileTime( 8. HANDLE hFile,&
52、#160; 9. CONST FILETIME *lpCreationTime, 10. CONST FILETIME *lpLastAccessTime, 11. CONST FILETIME *lpLastWriteTime 12. ); 13. typedef struct _FILETIME 14. DWO
53、RD dwLowDateTime; 15. DWORD dwHighDateTime; 16. FILETIME; 取得三個參數(shù)都是FILETIME結(jié)構(gòu),得到的都是UTC時間,可以通過API函數(shù)FileTimeToLocalFileTime()和 FileTimeToSystemTime()將他們轉(zhuǎn)換為本地時間和系統(tǒng)時間格式,也可以通過LocalFileTimeToFileTime 和SystemTimeToFileTime()轉(zhuǎn)換回來,通過S
54、etFileTime設(shè)置文件的創(chuàng)建時間、最后訪問時間、最后寫時間。由于使用的時候要 先打開文件,而且取得的最后訪問時間就是當(dāng)前時間,沒有多大意義,且比較麻煩,下面介紹CFile類中的靜態(tài)方法。 static BOOL PASCAL GetStatus( LPCTSTR lpszFileName, CFileStatus& rStatus ); static void SetStatus( LPCTSTR lpszFileName, const
55、CFileStatus& status ); throw( CFileException );返回的是一個CfileStatus對象,這個結(jié)構(gòu)的具體的成員變量包括:C+代碼1. struct CFileStatus 2. 3. CTime m_ctime; / 文件創(chuàng)建時間 4. CTime m_mtime; / 文件最近一次修改時間
56、0;5. CTime m_atime; / 文件最近一次訪問時間 6. LONG m_size; / 文件大小 7. BYTE m_attribute; / 文件屬性 8. BYTE _m_padding; / 沒有實際含義,用來增加一個字節(jié) 9. TCHAR m_szFullName_MAX_PATH; /絕對路徑
57、60; 10. #ifdef _DEBUG 11. /實現(xiàn)Dump虛擬函數(shù),輸出文件屬性 12. void Dump(CDumpContext& dc) const; 13. #endif 14. ; 下面就舉一個例子來實現(xiàn):C+代碼1. CFileStatus status; 2. char *path = "D:/VSS&
58、quot; 3. if(CFile:GetStatus( path, status ) 4. 5. CString cTime,mTime,aTime; 6. cTime = status.m_ctime.Format("文件建立時間:%Y年%m月%d日 %H時%M分%S秒"); 7. mTime = status.m_mtime.Format("文件最近修
59、改時間:%Y年%m月%d日 %H時%M分%S秒"); 8. aTime = status.m_atime.Format("文件最近訪問時間:%Y年%m月%d日 %H時%M分%S秒"); 9. CString str; 10. str = cTime + "/n" + mTime +"/n" + aTime
60、 11. MessageBox(str); 12. 13. 4取得和設(shè)置文件的屬性C+代碼1. DWORD GetFileAttributes( 2. LPCTSTR lpFileName /文件或文件夾路經(jīng) 3. ); 4. BOOL SetFileAttributes( 5. LPCTSTR lpFileName, / 文
61、件名 6. DWORD dwFileAttributes / 要設(shè)置的屬性 7. ); 取得的文件屬性包括:FILE_ATTRIBUTE_ARCHIVE,F(xiàn)ILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_NORMAL,F(xiàn)ILE_ATTRIBUTE_OFFLINE,F(xiàn)ILE_ATTRIBUTE_READONLY, FILE_ATTRIBUTE_SYSTEM,F(xiàn)ILE_ATTRIBUTE_TEMPORARY不能設(shè)置的文件屬性包括有: FILE_ATTR
62、IBUTE_COMPRESSED,F(xiàn)ILE_ATTRIBUTE_DIRECTORY, FILE_ATTRIBUTE_ENCRYPTED,F(xiàn)ILE_ATTRIBUTE_REPARSE_POINT, FILE_ATTRIBUTE_SPARSE_FILE,F(xiàn)ILE_ATTRIBUTE_SYSTEM。CFileStatus中也定義了一組屬性:C+代碼1. enum Attribute 2. normal, 3. readOnly, 4. hidden, 5. system,
63、 6. volume, 7. directory, 8. archive 9. ; 可以通過if(status. m_attribute& readOnly) = =FILE_ATTRIBUTE_READONLY)來判斷,這里利用另外的API來實現(xiàn)獲得文件的詳細(xì)信息:C+代碼1. HANDLE FindFirstFile( 2. LPCTSTR lpFileName, /文件或文件夾路經(jīng)r
64、160;3. LPWIN32_FIND_DATA lpFindFileData 4. ); 5. BOOL FindNextFile( 6. HANDLE hFindFile, 7. LPWIN32_FIND_DATA lpFindFileData 8. ); 9. BOOL FindClose(HANDLE hFindFile ); 取
65、得的是一個WIN32_FIND_DATA結(jié)構(gòu):C+代碼1. typedef struct _WIN32_FIND_DATA 2. DWORD dwFileAttributes; /文件屬性 3. FILETIME ftCreationTime; / 文件創(chuàng)建時間 4. FILETIME ftLastAccessTime; / 文件最后一次訪問時間 5. FIL
66、ETIME ftLastWriteTime; / 文件最后一次修改時間 6. DWORD nFileSizeHigh; / 文件長度高32位 7. DWORD nFileSizeLow; / 文件長度低32位 8. DWORD dwReserved0; / 系統(tǒng)保留 9. DWORD dwReserved1; /
67、;系統(tǒng)保留 10. TCHAR cFileName MAX_PATH / 長文件名 11. TCHAR cAlternateFileName 14 / 8.3格式文件名 12. WIN32_FIND_DATA, *PWIN32_FIND_DATA; 也可以利用另外一個函數(shù)來取得文件的信息:C+代碼1. BOOL GetFileInform
68、ationByHandle( 2. HANDLE hFile, / 文件的句柄 3. LPBY_HANDLE_FILE_INFORMATION lpFileInformation 4. ); 函數(shù)填充的是BY_HANDLE_FILE_INFORMATION結(jié)構(gòu)體:C+代碼1. typedef struct _BY_HANDLE_FILE_INFORMATION
69、2. DWORD dwFileAttributes; 3. FILETIME ftCreationTime; 4. FILETIME ftLastAccessTime; 5. FILETIME ftLastWriteTime; 6. DWORD dwVolumeSerialNumber; / 文件所在的磁盤的序列號 7. DWORD nFi
70、leSizeHigh; 8. DWORD nFileSizeLow; 9. DWORD nNumberOfLinks; /鏈接的數(shù)目 10. DWORD nFileIndexHigh; 11. DWORD nFileIndexLow; 12. BY_HANDLE_FILE_INFORMATION; 下面就舉一個例子來實現(xiàn):C+代碼1.
71、HANDLE handle; 2. WIN32_FIND_DATA find_data; 3. handle = : FindFirstFile("D:/VSS",&find_data); 4. FindClose(handle); 5. find_data.dwFileAttributes = find_data.dwFileAttributes|FILE_ATTRIBUTE_READONLY;
72、160; 6. :SetFileAttributes("D:/VSS",find_data.dwFileAttributes); 在上面的介紹中,除了可以設(shè)置文件的屬性之外,在操作的過程當(dāng)中也可以取得文件的其他一些信息,可以根據(jù)具體的需要來實現(xiàn)。 5獲取文件名,文件類型,文件長度,文件路徑用利用CFile打開一個文件時,可以在利用成員函數(shù) virtual CString GetF
73、ileName( ) const, virtual CString GetFileTitle( ) const, virtual CString GetFilePath( ) const, virtual DWORD GetLength( ) const;throw( CFileException ); 來取得相
74、關(guān)信息,如果一個文件的全路經(jīng)是: c:/windows/write/myfile.wri,則每個函數(shù)取得的是: myfile.wri, myfile, c:/windows/write/myfile.wri. GetLength取得文件大小是按字節(jié)為單位的。也可以利用: virtual void SetLength( DWORD dwNewLen );throw( CFileException ); virtual void SetFilePath(
75、LPCTSTR lpszNewName );來設(shè)置文件的長度和路徑。在當(dāng)前的文件下面新建一個Text.txt文件,在里面寫點東西,然后運行下面程序:C+代碼1. CFile file("Text.txt",CFile:modeReadWrite); 2. ULONGLONG length; 3. CString strFilePath; 4. length = file.GetLength(); 5. length =&
76、#160;length + 1024*10; 6. file.SetLength(length); 7. file.SetFilePath("D:/Text.txt"); 8. strFilePath = file.GetFilePath(); 9. MessageBox(strFilePath); 10. file.Close(); 最后發(fā)現(xiàn)文件的路徑變了,但是在D盤下面并沒有找到Text.t
77、xt,原因是SetFilePath只能指定一個路徑給文件,SetFilePath并不能做為移動文件來使用。CFile并沒有給出取得文件類型的函數(shù),有了上面基礎(chǔ),這個很容易實現(xiàn)。 API函數(shù)中也有獲得文件路徑的操作,這里只是做簡單介紹,可以參照MSDNN的說明:GetFileSize可以獲得文件的大小, GetFullPathName 函數(shù)獲取文件的完整路徑名,只有當(dāng)該文件在當(dāng)前目錄下,結(jié)果才正確。GetModuleFileName函數(shù)獲取文件的完整路徑名,這些函數(shù)有些用到文件 句柄的。用CFileDialog打開的文件,可以使用它的成員變量m_ofn,或者成
78、員函數(shù)GetFileName, GetFileTitle, GetFilePath, GetFileExt來取得相關(guān)信息. CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );各個
79、參數(shù)如下:·bOpenFileDialog 為TRUE為打開對話框,為FALSE為保存對話文件對話框·lpszDefExt 指定默認(rèn)的文件擴(kuò)展名。·lpszFileName 指定默認(rèn)的文件名。·dwFlags 指明一些特定風(fēng)格。·lpszFilter它指明可供選擇的文件類型和相應(yīng)的擴(kuò)展名。參數(shù)格式如: "Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*|&qu
80、ot;文件類型說明和擴(kuò)展名間用 | 分隔,同種類型文件的擴(kuò)展名間可以用 ; 分割,每種文件類型間用 | 分隔,末尾用 | 指明。pParentWnd 為父窗口指針 CString FileFilter = "所有文件(*.*)|*.*|" CFileDialog FileDialog(true,NULL,NULL,OFN_HIDEREADONLY,FileFilter,NULL);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物業(yè)管理服務(wù)委托及管理費支付協(xié)議
- 山西省晉中市太谷區(qū)職業(yè)中學(xué)校2024-2025學(xué)年高一上學(xué)期期末考試生物試題
- 離職員工知識產(chǎn)權(quán)保密協(xié)議
- 杭州車輛租賃協(xié)議書
- 股權(quán)法人轉(zhuǎn)讓協(xié)議
- 餐廳總經(jīng)理聘用合同
- 特定產(chǎn)品定制化生產(chǎn)合同
- 農(nóng)村遠(yuǎn)程教育及文化服務(wù)協(xié)議
- 2024-2025學(xué)年高二化學(xué)人教版選擇性必修3教學(xué)課件 第四章 第二節(jié) 蛋白質(zhì)
- 進(jìn)口采購合同
- 生物材料伴我行 知到智慧樹網(wǎng)課答案
- 【碧桂園項目成本控制存在的問題及優(yōu)化建議探析11000字(論文)】
- 2024年河北省初中學(xué)業(yè)水平適應(yīng)性測試生物學(xué)試卷
- 《鴻門宴》(教學(xué)課件)- 統(tǒng)編版高中語文必修下冊
- 標(biāo)識標(biāo)牌制作及安裝項目技術(shù)方案
- 醫(yī)療器械物價收費申請流程
- DB3410T 34-2024特定地域單元生態(tài)產(chǎn)品價值核算規(guī)范
- 青島中石化輸油管道爆炸事故調(diào)查報告
- 2024年蘇州職業(yè)大學(xué)高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 教科版小學(xué)科學(xué)六年級下冊單元練習(xí)試題及答案(全冊)
- 《Java程序設(shè)計》電子課件
評論
0/150
提交評論