第11章文件處理_第1頁
第11章文件處理_第2頁
第11章文件處理_第3頁
第11章文件處理_第4頁
第11章文件處理_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第11章 文件處理在Windows中,各種數(shù)據(jù)及信息都存儲在文件中。因此在Windows下的程序一般情況下都需要對文件進行數(shù)據(jù)的存儲和讀取。學習本章,讀者可以掌握C+程序文件輸入輸出的基本方法,以及利用MFC中的CFile類對文件進行操作的基本方法。11.1 文件的輸入輸出文件的輸入輸出是文件的基本操作。在C+中,文件的輸入輸出是十分簡單的事情。本節(jié)介紹C+中文件的輸入輸出操作的基本知識。11.1.1 C+對文件操作的支持C+把文件看做是字符序列,也就是說文件是由一個個字符數(shù)據(jù)順序組成的。根據(jù)數(shù)據(jù)的組織形式,文件分為文本文件和二進制文件。文本文件的每個字節(jié)存放一個ASCII碼,代表一個字符。二

2、進制文件則是把內(nèi)存中的數(shù)據(jù),按其在內(nèi)存中的樣子寫到磁盤中。文本文件是每個字節(jié)存放一個ASCII,即一個字節(jié)對應于一個字符,這樣可以很方便地進行操作,而二進制文件并不是每一個字節(jié)都對應一個字符,因此不可以以字符形式直接進行輸出。但是二進制文件比文本文件占用空間小,因此在程序中經(jīng)常用來保存一些中間結果,這些內(nèi)容有時需要再次送入內(nèi)存。在C+中要進行文件的輸入輸出,需要首先創(chuàng)建一個流,然后將這個流與文件相關聯(lián),即打開文件。這時就可以對文件進行操作,操作完成后關閉文件。11.1.2 文件的打開與關閉在利用Visual C+進行文件操作之前都需要首先打開文件。打開文件之后才可以對文件進行操作,當操作結束時

3、還需要關閉文件。下面對文件打開和關閉的基本過程進行介紹。1文件的打開在C+中文件的打開實際上就是將文件與一個流對象關聯(lián)起來,C+提供了3個標準的流類,3個流類列表如表11.1所示。表11.1 C+的流類名名 稱稱基基 類類作作 用用ofstreamostream文件的輸出文件的輸出ifstreamistream文件的輸入文件的輸入fstreamiostream文件的輸入或輸出文件的輸入或輸出在C+中,文件的打開一般需要進行下面幾步:(1)建立流對象。C+提供了3個標準的輸入輸出流,可以利用這些流類建立需要的對象。(2)使用流類的成員函數(shù)open()打開文件。其原型如下:void open( c

4、onst char* szName, int nMode, int nProt = filebuf:openprot ); 各個參數(shù)的含義分別為:szName表示文件名。nMode表示打開方式,它的取值為表11.2的一個或者幾個。表11.2 nMode的取值及其含義需要注意的是當利用此open()函數(shù)打開的文件不存在時,應用程序會新建一個文件,然后再進行打開。當需要以一種以上的方式打開文件時,即nMode的取值有多個,需要用“|”連接起來,這樣就可以以多種方式打開文件。注意:在Visual C+中使用C+的標準流類,需要包含頭文件iostream.h。nMode的取值的取值說說 明明ios:a

5、pp輸出追加到文件尾輸出追加到文件尾ios:ate查找文件尾查找文件尾ios:in打開文件進行讀操作打開文件進行讀操作ios:nocreate文件不存在,則打開失敗文件不存在,則打開失敗ios:noreplace文件存在,打開失敗文件存在,打開失敗ios:out打開文件進行寫操作打開文件進行寫操作ios:trunc刪除文件后重新新建文件刪除文件后重新新建文件ios:binary文件以二進制形式打開文件以二進制形式打開2文件的關閉在對文件的輸入輸出完成以后,需要關閉文件,即取消流對象和文件之間的關聯(lián)。文件的關閉需要使用close()函數(shù)。close()是流類的成員函數(shù),它的使用非常簡單,沒有參數(shù)

6、,也沒有返回值。11.1.3 文本文件的輸入和輸出在打開文件以后,就可以對文件進行輸入操作,即寫操作。使用運算符“”,就可以將內(nèi)容輸入到文件。在C+中對屏幕的輸出使用的是cout”,其他的含義是完全相同的?!臼纠?1.1】將110這10個整數(shù)輸入到文件中。新建一個控制臺應用程序,編寫代碼如下:程序運行后,屏幕上并不顯示任何內(nèi)容,因為輸出的內(nèi)容保存在文件中。打開當前目錄下的文件num,可以看到文件中的內(nèi)容如下:12345678910上面的例子是先建立一個輸出文件,然后寫入數(shù)據(jù),最后關閉文件??梢钥吹轿募幸驯4媪溯敵龅膬?nèi)容。11.1.4 二進制文件的輸入和輸出任何文件都可以以二進制形式打開,文本

7、文件是字符流,而二進制文件是字節(jié)流。在默認情況下,文件的打開方式是以文本文件的形式。如果需要指定以二進制文件打開文件,只需要在open()函數(shù)時指定方式為ios:binary方式。對二進制文件的讀寫有兩種方式,一種是使用get()和put()函數(shù),另一種是使用read()和write()函數(shù)。這四個函數(shù)也可以用于文本文件的讀寫,其使用方式與二進制文件的使用區(qū)別不大。1get()和put()函數(shù)的使用get()是輸入流類istream的成員函數(shù),它可以從流對象連接的文件中讀出數(shù)據(jù),每次讀取一個字節(jié)。put()是輸出流類ostream的成員函數(shù),它可以向流對象連接的文件寫入數(shù)據(jù)。get()和put

8、()函數(shù)的原型如下:istream& get( unsigned char& ruch );每次讀入一個字節(jié),并且放入rush中。ostream& put( char ch );將字符ch寫入到文件中。2read()和write()函數(shù)的使用read()和write()函數(shù)可以用來讀寫一個塊數(shù)據(jù),即可以讀寫結構體、數(shù)組等。其原型如下:istream& read( char* pch, int nCount );istream& read( unsigned char* puch, int nCount );istream& read( signe

9、d char* psch, int nCount );這個函數(shù)的第一個參數(shù)是塊數(shù)據(jù)的首字節(jié)地址,第二個參數(shù)是讀入的字節(jié)數(shù)。ostream& write( const char* pch, int nCount );ostream& write( const unsigned char* puch, int nCount );ostream& write( const signed char* psch, int nCount );這個函數(shù)參數(shù)的意義和read()函數(shù)的參數(shù)的意義完全相同,只不過這個函數(shù)是將數(shù)據(jù)寫入文件。【示例11.2】 將存放a到e的5個字符的數(shù)組寫入文

10、件。新建一個控制臺應用程序,編寫代碼如下:分析:程序運行后,屏幕上并不顯示任何內(nèi)容,因為輸出的內(nèi)容保存在文件中,打開當前目錄下的文件num,可以看到文件中的內(nèi)容如下:abcde本節(jié)介紹了在Visual C+中進行文件操作的基本函數(shù)和過程。在MFC中對這些操作以C+類的形式進行了封裝,使得文件的操作更加簡單和方便。在11.2節(jié)中將會看到使用MFC封裝的文件類進行文件操作的基本方法和過程。11.2 CFile類在MFC中利用C+類的形式封裝了對各種各樣的文件的操作。其中CFile類是文件操作的基類,提供了對普通文件進行的操作。11.2.1 初識CFile類在MFC中利用C+類的形式封裝了對各種各樣

11、的文件的操作。常見的類有下面幾種。CFile:文件類的基類,封裝了二進制磁盤文件的操作。CStdioFile:封裝了對緩沖流文件的操作。CMemFile:封裝了對內(nèi)存文件的操作。CShareFile:封裝了對共享內(nèi)存文件的操作。COleStreamFile:封裝了使用COMM Istream接口對復合文件的操作。CSocketFile:封裝了對Windows Socket提供的操作。說明:CFile類是CObject的派生類,因此它支持串行化操作。在應用中可以使用串行化操作保存文件。CFile類是文件類的基類,它封裝了對磁盤文件進行的操作,其成員函數(shù)如表11.3所示。表11.3 CFile的主

12、要成員函函 數(shù)數(shù)說說 明明CFile( LPCTSTR lpszFileName, UINT nOpenFlags );構造函數(shù)構造函數(shù)virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL );打開文件打開文件virtual void Close();關閉文件關閉文件virtual UINT Read( void* lpBuf, UINT nCount );讀入讀入nCount字節(jié)大小的內(nèi)容字節(jié)大小的內(nèi)容DWORD ReadHuge( void* lpBuffer, DWO

13、RD dwCount );讀入讀入dwCount字節(jié)大小的內(nèi)容字節(jié)大小的內(nèi)容virtual void Write( const void* lpBuf, UINT nCount );寫入寫入nCount字節(jié)大小的內(nèi)容字節(jié)大小的內(nèi)容void WriteHuge( const void* lpBuf, DWORD dwCount );寫入寫入dwCount字節(jié)大小的內(nèi)容字節(jié)大小的內(nèi)容virtual LONG Seek( LONG lOff, UINT nFrom );定位到指定位置的定位到指定位置的nFrom處處void SeekToBegin();定位到文件頭定位到文件頭DWORD SeekTo

14、End();定位到文件尾定位到文件尾virtual DWORD GetLength() const;得到文件大小得到文件大小virtual void SetLength( DWORD dwNewLen );設置文件大小設置文件大小virtual DWORD GetPosition() const;得到文件指針的位置得到文件指針的位置virtual CString GetFileName() const;得到文件名得到文件名static void PASCAL Rename( LPCTSTR lpszOldName, LPCTSTR lpszNewName );修改文件名修改文件名static

15、void PASCAL Remove( LPCTSTR lpszFileName );刪除文件刪除文件使用CFile類可以方便地進行文件操作,其中文件操作中需要首先打開文件,文件的打開方式是一個需要注意的問題。Open函數(shù)中參數(shù) nOpenFlags的常用取值為以下的一個或幾個。 CFile:modeCreate:打開文件時,如果文件不存在則新建一個文件。CFile:modeNoTruncate:普通方式打開文件。CFile:modeRead:只讀方式打開文件。CFile:modeReadWrite:文件可讀可寫。CFile:modeWrite:只寫方式打開文件。11.2.2 使用CFile類

16、前面介紹了CFile類的基本成員,下面結合實例對CFile類的使用進行介紹?!臼纠?1.3】 在對話框中利用CFile類實現(xiàn)保存在編輯框中輸入的內(nèi)容,單擊“顯示”按鈕后,在文件中保存該內(nèi)容,并且在另一個對話框中輸出文件的所有內(nèi)容。操作步驟如下:(1)新建一個基于對話框的應用程序。(2)在資源編輯環(huán)境中添加兩個編輯框和一個按鈕控件。(3)添加單擊按鈕控件的消息映射,編寫函數(shù)體如下:分析:上面代碼首先將編輯框1里面的內(nèi)容保存在文件的末尾,然后將文件里面的所有內(nèi)容讀出來,顯示在編輯框2里面。提示:應預先建立test.txt文件。(4)編譯、連接,運行結果如圖11.1所示。圖11.1 運行結果上面的編

17、輯框2中顯示的是文件中的所有內(nèi)容,在當前文件夾下可以找到“test.txt”文件,以記事本形式打開,可以看到里面內(nèi)容如下:這是第一次輸入這是第二次輸入下面進行第三次輸入好了,任務完成了本節(jié)介紹了使用MFC中封裝的文件類進行文件操作的基本方法和步驟。利用CFile類使得對文件的操作更加簡單和方便。該類包含了許多常見的操作。正確使用其提供的成員可以使得文件操作十分方便。11.3 CFileFind類CFileFind類是一個從CObject派生來的類。它可以對本地文件和遠程文件進行搜索和查找。是一個對文件系統(tǒng)操作常用的類。本節(jié)介紹該類的主要成員及其用法。11.3.1 初識CFileFind類CFi

18、leFind類是進行文件查找的類??梢詫Ρ镜匚募瓦h程文件進行查找。同時可以獲取文件的各種信息,例如文件的大小、文件的創(chuàng)建時間、文件的屬性等。CFileFind類主要的成員函數(shù)及其參數(shù)包括下面一些。(1)FindFile()函數(shù),該函數(shù)實現(xiàn)文件的查找。其函數(shù)原型如下:virtual BOOL FindFile( LPCTSTR pstrName = NULL, DWORD dwUnused = 0 );該函數(shù)若返回非0則表明執(zhí)行成功,0則表明執(zhí)行不成功。各個參數(shù)意義如下所示。pstrName:需要查找的文件名,例:“E:VC+Test.rar”,也可以是NULL表示“*.*。dwUnused:

19、必須為0。說明:在Visual C+中“”表示的是一個“”,因為第一個“”表示的是轉義字符。如果要出現(xiàn)兩個反斜杠,那么可以寫出如下形式:“”。(2)FindNextFile()函數(shù),該函數(shù)查找是否還有符合條件的文件。其函數(shù)原型如下:virtual BOOL FindNextFile( );該函數(shù)返回值非0表示還有符合條件的文件,0表示是最后一個文件。(3)GetCreationTime()函數(shù),查找文件的創(chuàng)建時間。函數(shù)原型如下:virtual BOOL GetCreationTime(FILETIME *pFileTime) constvirtual BOOL GetCreationTime(

20、CTime& refTime) const;該函數(shù)用來獲得查找到的某個文件的創(chuàng)建時間,返回值非0表示獲得創(chuàng)建時間操作成功,0表示執(zhí)行獲得創(chuàng)建時間失敗。參數(shù)意義如下所示。FILETIME*:容納時間的結構指針。CTime&:容納時間的對象地址。(4)GetLastAccessTime()函數(shù),得到文件最后被訪問的時間。函數(shù)原型如下:virtual BOOL GetLastAccessTime(FILETIME *pFileTime) constvirtual BOOL GetLastAccessTime(CTime& refTime) const;該函數(shù)用來獲得某個文件最

21、后被訪問的時間,非0表示執(zhí)行成功,0表示執(zhí)行失敗。(5)GetFilePath()函數(shù),該函數(shù)用來查找文件的絕對路徑。函數(shù)原型如下:virtual CString GetFilePath() const;該函數(shù)用來獲得查找到的文件絕對路徑,必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。返回的結果是CString對象。(6)GetFileName()函數(shù),該函數(shù)可以用來得到文件的全稱。函數(shù)的原型如下:virtual CString GetFileName() const;該函數(shù)用來獲得查找到的文件的全稱,必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。返回的結果是C

22、String對象,例“Test.rar”。(7)GetFileTitle()函數(shù),可以用來得到文件的名稱。函數(shù)原型如下:virtual CString GetFileTitle() const;該函數(shù)用來獲得查找到的文件的名稱,必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。返回的結果是CString對象,例“Test”。(8)GetRoot()函數(shù),得到查找文件的根目錄,函數(shù)原型如下:virtual CString GetRoot() const;該函數(shù)用來獲得查找到的文件的根目錄,必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。返回的結果是CString對象,例

23、“E:”。(9)GetFileURL()函數(shù),查找文件的URL路徑。函數(shù)原型如下:virtual CString GetFileURL() const;該函數(shù)用來獲得查找到的文件的URL路徑,必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。返回的結果是CString對象,例“file:/E:Test.rar”。(10)GetLength()函數(shù),獲取文件的長度。函數(shù)原型如下:DWORD GetLength() const;該函數(shù)返回值獲得查找到的文件的長度,必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。(11)IsHidden() 函數(shù),判斷文件屬性。函數(shù)原型如下

24、:BOOL IsHidden() const;該函數(shù)用來判斷查找的文件屬性是否隱藏文件,非0表示是,0表示不是。必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。(12)MatchesMask函數(shù),查找文件的綜合屬性。函數(shù)原型如下:BOOL MatchesMask(DWORD dwMask) const;該函數(shù)用來判斷查找的文件的綜合屬性,非0表示是,0表示不是。必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。dwMask參數(shù)表示文件屬性的結構,其取值為下面的一種或幾種。FILE_ATTRIBUTE_ARCHIVE:檔案文件。FILE_ATTRIBUTE_COMPRE

25、SSED:壓縮文件。FILE_ATTRIBUTE_DIRECTORY:路徑文件。FILE_ATTRIBUTE_NORMAL:正常文件。FILE_ATTRIBUTE_READONLY:只讀文件。FILE_ATTRIBUTE_SYSTEM:系統(tǒng)文件。FILE_ATTRIBUTE_TEMPORARY:臨時文件。FILE_ATTRIBUTE_HIDDEN:隱藏文件。注意:在上面函數(shù)中有些函數(shù)必須在執(zhí)行了FindNextFile()后才能調用。否則程序會產(chǎn)生異常。11.3.2 使用CFileFind類CFileFind函數(shù)可以對本地文件進行查找。最常用的例如遍歷某個文件夾下的所有文件等。例如,Windo

26、ws自帶的資源管理器就可以利用該類來實現(xiàn)。本節(jié)結合一個小例子介紹該類的使用?!臼纠?1.4】 利用CFileFind類遍歷D:目錄下的“test”文件夾下的所有文件。并顯示在樹視圖控件中。具體步驟如下所述。(1)創(chuàng)建一個基于對話框的應用程序。在上面添加一個樹視圖控件,其ID為IDC_TREE,并且設置控件的樣式為有節(jié)點前面的“+”號等,樣式設置如圖11.2所示。圖11.2 設置樹視圖樣式(2)在CTestDlg中添加變量如下:CImageList m_imageList;TV_INSERTSTRUCT tvinsert;HTREEITEM hDad;HICON hIcon;(3)在OnInit

27、Dialog()函數(shù)中對樹視圖控件進行初始化工作,包括設置圖標等。代碼如下:分析:上面的代碼對樹視圖的樣式、圖標等內(nèi)容進行了初始化工作。并且顯示了第一層圖標。但此時需要遍歷搜索D:test目錄下的所有文件,并將文件名在樹視圖上顯示出來。下面對文件搜索進行介紹。(4)在CTestDlg中添加一個函數(shù)實現(xiàn)文件的遍歷查找,void Findfile(CString str, HTREEITEM h);函數(shù),在該函數(shù)中遍歷查找文件,并且將文件目錄顯示在樹視圖控件中。代碼如下:分析:上面函數(shù)利用遞歸實現(xiàn)文件的遍歷。并且將文件目錄顯示在樹視圖控件上。需要注意的是當所示的文件為一個目錄時要對該目錄進行遍歷,

28、此時進行搜索時,要保留當前的節(jié)點,然后該節(jié)點稱為父節(jié)點,進行顯示。搜索結束后再次設置當前節(jié)點為剛才保留的同級節(jié)點。為了在對話框顯示時就搜索文件,可以在上面的OnInitDialog()函數(shù)中調用上面的函數(shù)。(5)編譯、連接,運行結果如圖11.3所示。圖11.3 運行結果通過上面的實例可以看到CFileFind的具體使用方法,使用CFileFind可以方便地對各種目錄下的文件進行搜索。它可以對本地文件和遠程文件進行搜索和查找。是一個對文件系統(tǒng)操作時常用的類。在進行文件系統(tǒng)的程序設計中經(jīng)常使用該類進行文件的查找操作等。11.4 數(shù)據(jù)的對象化串行化在文檔程序設計中曾經(jīng)介紹了MFC中串行化的概念。所謂

29、的串行化是指微軟提供的用于對對象進行文件輸入輸出的一種機制。在CObject類中提供了串行化的操作,因此使用串行化操作可以方便地實現(xiàn)CFile類的存儲問題。11.4.1 CFile類與串行化CFile類是MFC中進行文件操作的類,該類直接從CObject類派生而來。因此該類可以利用串行化進行輸入輸出。為了實現(xiàn)串行化,可以先了解串行化的知識。所謂的串行化是指將對象存儲到介質中,之后可以通過反串行化從這些連續(xù)的數(shù)據(jù)重新構建一個與原始對象狀態(tài)相同的對象,因此在特定情況下也可以說是得到一個副本。在MFC的主要基類CObject類中提供了對串行化的支持,在使用串行化時,可以首先創(chuàng)建一個CArchive對

30、象,然后使用該對象進行串行化操作。CArchive類在MFC中沒有任何基類,該類提供了一個類型安全緩沖機制,用于將可串行化對象寫入CFile對象或從中讀取可串行化對象。CArchive類的對象是作為串行化對象和存儲介質之間的中介。因此在使用CArchive對象前必須先建CFile對象,然后使用該CFile對象定義CArchive對象。下面介紹CFile進行串行化保存和讀取的基本過程,數(shù)據(jù)保存時的基本步驟為:(1)創(chuàng)建一個CFile對象,此時需要創(chuàng)建文件。(2)創(chuàng)建一個CArchive對象,此時需要使用CFile對象,參數(shù)為CArchive:store類型。(3)重載Serialize()函數(shù),

31、實現(xiàn)串行化操作。(4)在需要保存的地方調用Serialize()函數(shù),實現(xiàn)保存。上面介紹了CFile進行串行化保存的基本步驟,串行化讀?。ㄒ卜Q為反串行化)的步驟與保存時的基本步驟類似。只不過創(chuàng)建CArchive對象時指定參數(shù)為CArchive:load。CFile可以進行數(shù)據(jù)的存儲和讀取,而CArchive從一個更高的層次上進行了數(shù)據(jù)的管理。這樣使得CFile類轉換到CArchive類,然后實現(xiàn)串行化操作。在11.4.2節(jié)中將看到使用串行化操作的具體的使用過程。說明:CArchive類并不是MFC整個系統(tǒng)中的類,它沒有基類。但是在MFC中提供了進行串行化操作異常類:CArchiveExcept

32、ion類。11.4.2 操作實例前面介紹了CFile類與串行化的關系,在實際應用中使用串行化操作可以簡化數(shù)據(jù)的處理過程,使得應用程序更加簡單。下面結合具體實例介紹CFile進行串行化的基本過程?!臼纠?1.5】 創(chuàng)建一個基于對話框的應用程序,在上面添加多個編輯框控件實現(xiàn)學生信息的輸入。實現(xiàn)數(shù)據(jù)的保存和讀取。具體步驟如下所述。(1)創(chuàng)建一個基于對話框的應用程序。(2)在對話框上添加多個編輯框控件,實現(xiàn)對學生信息的輸入。并且利用向導為文本框控件添加變量??丶腎D和添加的變量,以及輸入的信息如表11.4所示。表11.4 編輯框的ID和變量控件控件ID變變 量量功功 能能IDC_NAMECStringm_name;姓名姓名IDC_AGEintm_age;年齡年齡IDC_SEXCStringm_sex;性別性別IDC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論