VC++文件操作之最全篇_第1頁
VC++文件操作之最全篇_第2頁
VC++文件操作之最全篇_第3頁
VC++文件操作之最全篇_第4頁
VC++文件操作之最全篇_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論