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