用dw制作個介紹家鄉(xiāng)網(wǎng)站煙臺網(wǎng)站建設
文章目錄
- 前言
- 一、文件指針是什么?
- 二、設置文件指針的位置:隨機讀寫,SetFilePointer函數(shù)
- 1.函數(shù)說明
- 2.函數(shù)實例
- 三、 目錄的創(chuàng)建CreateDirectory
- 四、目錄的刪除RemoveDirectory
- 總結
前言
Windows程序設計10:文件指針及目錄的創(chuàng)建與刪除。
一、文件指針是什么?
文件指針主要用于文件的讀和寫。打開一個文件后,默認就與之產(chǎn)生了一個內(nèi)部的記錄文件位置的指針,用于指示當前的讀寫位置。當進行了文件的讀寫操作后,指針會自動往后移動。讀寫了多少字節(jié),就會往后移動多少字節(jié)。默認情況下可能我們也不需要關心文件的指針,因為文件的指針位置都是默認自動控制的。當你想要從一個文件的指定位置進行讀寫的時候就需要用到文件指針。如大文件的斷點續(xù)傳形式下載。
二、設置文件指針的位置:隨機讀寫,SetFilePointer函數(shù)
1.函數(shù)說明
函數(shù)原型如下
DWORD SetFilePointer(HANDLE hFile, // 文件句柄LONG lDistanceToMove, // 要移動的距離(低 32 位)PLONG lpDistanceToMoveHigh, // 要移動的距離(高 32 位)DWORD dwMoveMethod // 移動的起始位置
);
參數(shù) HANDLE hFile為文件句柄,必須是通過 CreateFile 打開的句柄。句柄必須具有 GENERIC_READ 或 GENERIC_WRITE 訪問權限。
參數(shù)LONG lDistanceToMove為要移動的距離(低 32 位)。如果 lpDistanceToMoveHigh 為 NULL,則這是一個有符號的 32 位值。
PLONG lpDistanceToMoveHigh指向一個 LONG 變量的指針,用于指定要移動的距離(高 32 位)。如果為 NULL,則文件指針移動范圍限制在 32 位。
DWORD dwMoveMethod指定文件指針移動的起始位置??梢允且韵轮抵?#xff1a;FILE_BEGIN:從文件開頭開始移動。FILE_CURRENT:從當前位置開始移動。FILE_END:從文件末尾開始移動。
返回值:如果函數(shù)執(zhí)行成功,返回文件指針的新位置(低 32 位)。如果函數(shù)執(zhí)行失敗,返回 INVALID_SET_FILE_POINTER??梢酝ㄟ^ GetLastError 獲取錯誤代碼。注意:高32位的值通過參數(shù)PLONG lpDistanceToMoveHigh傳出。
2.函數(shù)實例
與之前一樣,寫入如下數(shù)據(jù)
// 寫入數(shù)據(jù)// 寫入一個數(shù)字int num = 12345; // 寫入的數(shù)據(jù)DWORD rw = 0; // 傳出的實際寫入大小bret = WriteFile(handle1, &num, sizeof(num), &rw, NULL);// 寫入一個字母char ch = 'A';bret = WriteFile(handle1, &ch, sizeof(ch), &rw, NULL);// 寫入包含中文的字符串char st[32] = "abc要好好學習!";bret = WriteFile(handle1, st, sizeof(st), &rw, NULL);if (bret){MessageBox(NULL, _T("數(shù)據(jù)寫入成功"), _T("提示"), MB_OK);}else{MessageBox(NULL, _T("數(shù)據(jù)寫入失敗"), _T("提示"), MB_OK);}CloseHandle(handle1);}
則文件中數(shù)據(jù)為
想要實現(xiàn)直接讀取字符串“abc要好好學習”,即略過前面的數(shù)字123345和字符A進行讀取。
handle1 = CreateFile(_T("D:\\新年快樂.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (handle1 != INVALID_HANDLE_VALUE) // 函數(shù)執(zhí)行成功{// 讀取數(shù)字DWORD readw = 0;// 移動文件指針位置SetFilePointer(handle1, sizeof(int) + sizeof(char), NULL, FILE_BEGIN);// 讀取字符串char read_str[32] = { 0 };bret = ReadFile(handle1, read_str, sizeof(read_str), &readw, NULL);if (bret){MessageBox(NULL, _T("數(shù)據(jù)讀入成功"), _T("提示"), MB_OK);}else{MessageBox(NULL, _T("數(shù)據(jù)讀入失敗"), _T("提示"), MB_OK);}CloseHandle(handle1);}else{DWORD dwerror = GetLastError();MessageBox(NULL, _T("文件沒有成功打開"), _T("提示"), MB_OK);}
可以看到讀取成功
上述代碼是從文件開頭向后移動,移動了一個int和一個char這么多的距離,下面演示一下從文件末尾向前移動,移動那么就需要移動字符串這么多的距離。這里設置字符串長度為32字節(jié),因此只需要更改SetFilePointer這行代碼
SetFilePointer(handle1, -32, NULL, FILE_END);
同樣能夠正確讀取字符串
三、 目錄的創(chuàng)建CreateDirectory
用于創(chuàng)建單一層級的目錄。建立多層級目錄需要使用函數(shù)MakeSureDirectoryPathExists。這里只介紹CreateDirectory,函數(shù)原型如下
BOOL CreateDirectory(LPCTSTR lpPathName, // 目錄路徑LPSECURITY_ATTRIBUTES lpSecurityAttributes // 安全屬性
);
參數(shù)LPCTSTR lpPathName為要創(chuàng)建的目錄的路徑??梢允墙^對路徑或相對路徑。
參數(shù)LPSECURITY_ATTRIBUTES lpSecurityAttributes指向 SECURITY_ATTRIBUTES 結構的指針,用于設置目錄的安全屬性。如果為 NULL,則使用默認安全屬性。
返回值:如果成功,返回 TRUE。如果失敗,返回 FALSE??梢酝ㄟ^ GetLastError 獲取錯誤碼。
以在D盤下創(chuàng)建一個學習C++的文件夾為例
CreateDirectory(_T("D://學習C++"), NULL);
文件夾創(chuàng)建成功
但是連續(xù)創(chuàng)建子文件夾就會出現(xiàn)問題,刪掉剛剛創(chuàng)建的“學習C++”文件夾后運行如下代碼
BOOL bret = CreateDirectory(_T("D:\\學習C++\\123"), NULL);if (!bret){int err = GetLastError();}
可以看到err錯誤碼為3
錯誤碼3對應的問題為
這就是上述建立多層級目錄不可以使用CreateDirectory。
四、目錄的刪除RemoveDirectory
刪除一個現(xiàn)有的不包含任何文件的空目錄,要刪除非空目錄需要調(diào)用SHFileOperation。這里只介紹RemoveDirectory,函數(shù)聲明為
BOOL RemoveDirectory(LPCTSTR lpPathName // 目錄路徑
);
參數(shù)LPCTSTR lpPathName為要刪除的目錄的路徑??梢允墙^對路徑或相對路徑。路徑的最大長度為 MAX_PATH(260 個字符)。
返回值:如果函數(shù)執(zhí)行成功,返回 TRUE。如果失敗,返回 FALSE??梢酝ㄟ^ GetLastError 獲取錯誤碼。
刪除D盤下的“學習C++”文件夾,文件夾內(nèi)部還有一個子文件夾123。
代碼如下
// 刪除文件目錄BOOL bret_re = RemoveDirectory(_T("D:\\學習C++"));if (!bret_re){int err = GetLastError();}
函數(shù)執(zhí)行失敗,錯誤碼為145
對應的問題為
這就是由于存在子文件夾導致的,如果不包含子目錄
則此時上述代碼運行成功,D盤內(nèi)的文件夾“學習C++”成功刪除。
總結
Windows程序設計10:文件指針及目錄的創(chuàng)建與刪除。