Windows程序设计10:文件指针及目录的创建与删除
文章目录
- 前言
- 一、文件指针是什么?
- 二、设置文件指针的位置:随机读写,SetFilePointer函数
- 1.函数说明
- 2.函数实例
- 三、 目录的创建CreateDirectory
- 四、目录的删除RemoveDirectory
- 总结
前言
Windows程序设计10:文件指针及目录的创建与删除。
一、文件指针是什么?
文件指针主要用于文件的读和写。打开一个文件后,默认就与之产生了一个内部的记录文件位置的指针,用于指示当前的读写位置。当进行了文件的读写操作后,指针会自动往后移动。读写了多少字节,就会往后移动多少字节。默认情况下可能我们也不需要关心文件的指针,因为文件的指针位置都是默认自动控制的。当你想要从一个文件的指定位置进行读写的时候就需要用到文件指针。如大文件的断点续传形式下载。
二、设置文件指针的位置:随机读写,SetFilePointer函数
1.函数说明
函数原型如下
DWORD SetFilePointer(
HANDLE hFile, // 文件句柄
LONG lDistanceToMove, // 要移动的距离(低 32 位)
PLONG lpDistanceToMoveHigh, // 要移动的距离(高 32 位)
DWORD dwMoveMethod // 移动的起始位置
);
参数 HANDLE hFile为文件句柄,必须是通过 CreateFile 打开的句柄。句柄必须具有 GENERIC_READ 或 GENERIC_WRITE 访问权限。
参数LONG lDistanceToMove为要移动的距离(低 32 位)。如果 lpDistanceToMoveHigh 为 NULL,则这是一个有符号的 32 位值。
PLONG lpDistanceToMoveHigh指向一个 LONG 变量的指针,用于指定要移动的距离(高 32 位)。如果为 NULL,则文件指针移动范围限制在 32 位。
DWORD dwMoveMethod指定文件指针移动的起始位置。可以是以下值之一:FILE_BEGIN:从文件开头开始移动。FILE_CURRENT:从当前位置开始移动。FILE_END:从文件末尾开始移动。
返回值:如果函数执行成功,返回文件指针的新位置(低 32 位)。如果函数执行失败,返回 INVALID_SET_FILE_POINTER。可以通过 GetLastError 获取错误代码。注意:高32位的值通过参数PLONG lpDistanceToMoveHigh传出。
2.函数实例
与之前一样,写入如下数据
// 写入数据
// 写入一个数字
int num = 12345; // 写入的数据
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("数据写入成功"), _T("提示"), MB_OK);
}
else
{
MessageBox(NULL, _T("数据写入失败"), _T("提示"), MB_OK);
}
CloseHandle(handle1);
}
则文件中数据为
想要实现直接读取字符串“abc要好好学习”,即略过前面的数字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) // 函数执行成功
{
// 读取数字
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("数据读入成功"), _T("提示"), MB_OK);
}
else
{
MessageBox(NULL, _T("数据读入失败"), _T("提示"), MB_OK);
}
CloseHandle(handle1);
}
else
{
DWORD dwerror = GetLastError();
MessageBox(NULL, _T("文件没有成功打开"), _T("提示"), MB_OK);
}
可以看到读取成功
上述代码是从文件开头向后移动,移动了一个int和一个char这么多的距离,下面演示一下从文件末尾向前移动,移动那么就需要移动字符串这么多的距离。这里设置字符串长度为32字节,因此只需要更改SetFilePointer这行代码
SetFilePointer(handle1, -32, NULL, FILE_END);
同样能够正确读取字符串
三、 目录的创建CreateDirectory
用于创建单一层级的目录。建立多层级目录需要使用函数MakeSureDirectoryPathExists。这里只介绍CreateDirectory,函数原型如下
BOOL CreateDirectory(
LPCTSTR lpPathName, // 目录路径
LPSECURITY_ATTRIBUTES lpSecurityAttributes // 安全属性
);
参数LPCTSTR lpPathName为要创建的目录的路径。可以是绝对路径或相对路径。
参数LPSECURITY_ATTRIBUTES lpSecurityAttributes指向 SECURITY_ATTRIBUTES 结构的指针,用于设置目录的安全属性。如果为 NULL,则使用默认安全属性。
返回值:如果成功,返回 TRUE。如果失败,返回 FALSE。可以通过 GetLastError 获取错误码。
以在D盘下创建一个学习C++的文件夹为例
CreateDirectory(_T("D://学习C++"), NULL);
文件夹创建成功
但是连续创建子文件夹就会出现问题,删掉刚刚创建的“学习C++”文件夹后运行如下代码
BOOL bret = CreateDirectory(_T("D:\\学习C++\\123"), NULL);
if (!bret)
{
int err = GetLastError();
}
可以看到err错误码为3
错误码3对应的问题为
这就是上述建立多层级目录不可以使用CreateDirectory。
四、目录的删除RemoveDirectory
删除一个现有的不包含任何文件的空目录,要删除非空目录需要调用SHFileOperation。这里只介绍RemoveDirectory,函数声明为
BOOL RemoveDirectory(
LPCTSTR lpPathName // 目录路径
);
参数LPCTSTR lpPathName为要删除的目录的路径。可以是绝对路径或相对路径。路径的最大长度为 MAX_PATH(260 个字符)。
返回值:如果函数执行成功,返回 TRUE。如果失败,返回 FALSE。可以通过 GetLastError 获取错误码。
删除D盘下的“学习C++”文件夹,文件夹内部还有一个子文件夹123。
代码如下
// 删除文件目录
BOOL bret_re = RemoveDirectory(_T("D:\\学习C++"));
if (!bret_re)
{
int err = GetLastError();
}
函数执行失败,错误码为145
对应的问题为
这就是由于存在子文件夹导致的,如果不包含子目录
则此时上述代码运行成功,D盘内的文件夹“学习C++”成功删除。
总结
Windows程序设计10:文件指针及目录的创建与删除。