windows-文件相关操作

函数名称功能
DeleteFile 删除指定文件
CopyFile 复制指定文件
CreateFile 创建或者打开I/O设备
MoveFile 移动文件
ReadFile 读取文件
WriteFile 向文件写入内容
GetFileSize 获取文件大小
CreateDirectory 创建目录
GetModuleFileName 获取当前模块全路径
FindFirstFile 查找指定目录下的第一个文件/目录,并获得句柄
FindNextFile 根据句柄循环查找其他文件目录
GetFileAttributeEx 设置文件属性
SetFileAttribute 将文件时间转换为本地文件时间
FileTimeToLocalFileTime 将文件时间转换为本地系统时间
   

删除文件-DeleteFile

BOOL DeleteFile( LPCTSTR lpFileName );

直接加地址就好了

BOOL Delete_File(LPCWSTR a)
{
BOOL ret= DeleteFile(a);
if (ret)
{
return true;
}
else
{
return false;
}
}

复制指定文件-CopyFile

BOOL CopyFile(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
BOOL   bFailIfExists
);

参数

第一个参数表示存在的文件的地址,第二个参数表示要复制到的新文件的地址

第二个参数表示要复制到的文件地址

第三个参数是宏定义,如果是false表示当文件存在时直接覆盖,为true表示当文件存在时返回错误

返回值

成功返回非0,不成功返回0

void Copy_File()
{
BOOL ret =CopyFile(L"C:\\test.txt",L"F:\\test.txt",FALSE);
if (ret)
{
MessageBox(NULL, TEXT("复制文件成功"), TEXT("复制文件"), MB_OK);
}
else
{
MessageBox(NULL, TEXT("复制文件失败"), TEXT("复制文件"), MB_OK);
}
}

 

CreateFile 创建文件

CreateFile 函数创建或打开下列对象,并返回一个可以用来访问这些对象的句柄。 文件 pipes 邮槽 通信资源 磁盘驱动器(仅适用于 windowsNT ) 控制台 文件夹(仅用于打开)

HANDLE CreateFileW(
LPCWSTR               lpFileName,
DWORD                 dwDesiredAccess,
DWORD                 dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD                 dwCreationDisposition,
DWORD                 dwFlagsAndAttributes,
HANDLE               hTemplateFile
);

 

参数

lpFileName表示文件路径

dwDesiredAccess表示需要的访问权限常见有读写或者又读又写

dwShareMode表示在该进程使用该文件的时候,别的进程的访问权限。

lpSecurityAttributes 安全描述符

dwCreationDisposition 对存在或不存在的文件或设备执行的操作。

dwFlagsAndAttributes 文件或设备属性和标志

hTemplateFile具有GENERIC_READ访问权限的模板文件的有效句柄。模板文件为正在创建的文件提供文件属性和扩展属性。

返回值

成功:返回的是指定的文件或设备的句柄

失败 :返回值为INVALID_HANDLE_VALUE

void Create_File()
{
HANDLE hFile;
hFile = CreateFile(
L"F:\\test.txt", //文件路径
GENERIC_READ | GENERIC_WRITE,//操作办法
FILE_SHARE_READ, //其他进程的访问权限
NULL,//安全描述符
OPEN_ALWAYS, //不存在的时候创建,存在的时候打开
FILE_ATTRIBUTE_NORMAL,
NULL
);
CloseHandle(hFile);
}

 

MoveFile 移动文件

把文件移动到另一个地方

BOOL MoveFile(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName
);

参数

第一个参数表示文件存在的路径

第二个参数表示要移动到的路径

返回值

成功返回非0,失败返回0

void Move_File()
{
BOOL ret = MoveFile(L"E:\\test.txt",L"F:\\test.txt");
if (ret)
{
MessageBox(NULL, TEXT("移动文件成功"), TEXT("移动文件"), MB_OK);
}
else
{
MessageBox(NULL, TEXT("移动文件失败"), TEXT("移动文件"), MB_OK);
}
}

WriteFile 向文件写入内容

将数据写入指定的文件或输入/输出(I / O)设备。

BOOL WriteFile(
HANDLE       hFile,
LPCVOID     lpBuffer,
DWORD       nNumberOfBytesToWrite,
LPDWORD     lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);

参数

hFile 文件或I/O设备句柄

lpBuffer 写入数据的缓冲区指针

nNumberOfBytesToWrite 要写入的数据的大小

lpNumberOfBytesWritten 用于返回实际存储数据大小的指针,也就是说获得存入了多少数据的大小的指针返回

lpOverlapped 倘若在指定FILE_FLAG_OVERLAPPED的前提下打开文件,指针不能为空,这个参数就必须引用一个特殊的结构。那个结构定义了一次异步写操作。否则,该参数应置为空(将声明变为ByVal As Long,并传递零值)

void Write_File(HANDLE hFile)
{
/*
BOOL WriteFile(
HANDLE       hFile,
LPCVOID     lpBuffer,
DWORD       nNumberOfBytesToWrite,
LPDWORD     lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);*/
char buf[1024] = "test";
LPCVOID a = buf;
DWORD sz;
BOOL ret =WriteFile(hFile, buf, sizeof(buf), &sz, NULL);
if (ret)
{
MessageBox(NULL, TEXT("写入文件成功"), TEXT("写入文件"), MB_OK);
}
else
{
MessageBox(NULL, TEXT("写入文件失败"), TEXT("写入文件"), MB_OK);
}
}

ReadFile 读取文件

和WriteFileAPI类似,需要的是在打开获得文件句柄的时候添加上读取文件的句柄,再调用ReadFile函数来读

BOOL ReadFile(
HANDLE       hFile,
LPVOID       lpBuffer,
DWORD       nNumberOfBytesToRead,
LPDWORD     lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);

参数

参数和WriteFile函数参数雷同

void Read_File(HANDLE hFile)
{
/*
BOOL ReadFile(
HANDLE       hFile,
LPVOID       lpBuffer,
DWORD       nNumberOfBytesToRead,
LPDWORD     lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);*/
char buf[1024] = { 0 };
DWORD sz;
BOOL ret =ReadFile(hFile, buf, sizeof(buf), &sz, NULL);
if (ret)
{
//MessageBox(NULL,TEXT("读取文件数据成功"),TEXT("读取文件数据"),MB_OK)
printf("读取数据为%s\n", buf);
}
else
{
MessageBox(NULL, TEXT("读取文件失败"), TEXT("读取文件数据"), MB_OK);
}
}

GetFileSize 获取文件大小

获得指定文件大小

DWORD GetFileSize(
HANDLE hFile,
LPDWORD lpFileSizeHigh
);

示例:

void Get_File_Size(HANDLE hFile)
{
/*DWORD GetFileSize(
HANDLE hFile,
LPDWORD lpFileSizeHigh
);*/
DWORD sz;
sz = GetFileSize(hFile, &sz);
printf("文件大小为%d", sz);
}

CreateDirectory 创建目录

BOOL CreateDirectoryA(
LPCSTR               lpPathName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

同样的第一个参数表示目录,第二个表示安全描述符

void Create_Directory()
{
/*BOOL CreateDirectoryA(
LPCSTR               lpPathName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);*/
BOOL ret = CreateDirectory(TEXT("F:\\test"),NULL);
if (ret)
{
MessageBox(NULL, TEXT("创建目录成功"), TEXT("创建目录"), MB_OK);
}
else
{
MessageBox(NULL, TEXT("创建目录失败"), TEXT("创建目录"), MB_OK);
}
}

GetModuleFileName 获取当前模块全路径

DWORD GetModuleFileNameA(
HMODULE hModule,
LPSTR   lpFilename,
DWORD   nSize
);

 

参数:

第一个hModule:正在请求其路径的已加载模块的句柄。如果此参数为NULL,则 GetModuleFileName检索当前进程的可执行文件的路径。

lpFilename:指向缓冲区的指针,该缓冲区接收模块的标准路径。如果路径的长度小于nSize参数指定的大小,则函数将成功执行,并且路径将以空终止的字符串形式返回。

例子

void Get_Current_Path()
{
/*
DWORD GetModuleFileNameA(
HMODULE hModule,
LPSTR   lpFilename,
DWORD   nSize
);*/
char a[1024];
GetModuleFileName(NULL,LPWSTR(a),sizeof(a));
printf("当前路径为%ls\n", a);
}

遍历目录

FindFirstFile 查找指定目录下的第一个文件/目录,并获得句柄

在目录中搜索名称或名称与特定名称(如果使用通配符,则为部分名称)匹配的文件或子目录。

HANDLE FindFirstFileA(
LPCSTR             lpFileName,
LPWIN32_FIND_DATAA lpFindFileData
);

参数

第一个参数表示文件夹的目录

目录或路径,以及文件名。文件名可以包含通配符,例如,星号(*)或问号(?)。

第二个参数是一个结构体用来描述文件或者目录的信息,这个结构体类似于进程快照的结构体,是用来存储信息的,所以只需要新建一个然后赋值的时候有对应的赋值

返回值

如果成功则会返回对应的句柄,如果失败就会返回INVALID_HANDLE_VALUE

FindNextFile 根据句柄循环查找其他文件目录

BOOL FindNextFileA(
HANDLE             hFindFile,
LPWIN32_FIND_DATAA lpFindFileData
);

和FineFirstFile是差不多的

例子

void Ergodic_Catalog()
{
setlocale(LC_ALL,"chs");
/*
HANDLE FindFirstFileA(
LPCSTR             lpFileName,
LPWIN32_FIND_DATAA lpFindFileData
);
*/
/*
typedef struct _WIN32_FIND_DATAA {
DWORD   dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD   nFileSizeHigh;
DWORD   nFileSizeLow;
DWORD   dwReserved0;
DWORD   dwReserved1;
CHAR     cFileName[MAX_PATH];
CHAR     cAlternateFileName[14];
DWORD   dwFileType;
DWORD   dwCreatorType;
WORD     wFinderFlags;
} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;*/
WIN32_FIND_DATA FindData = { 0 };
HANDLE hFile = FindFirstFile(TEXT("E:\\*"),&FindData);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, TEXT("打开目录失败"), TEXT("打开目录"), MB_OK);
}
else//继续访问下一个
{
do
{
printf("%ls\n", FindData.cFileName);
} while (FindNextFile(hFile, &FindData));
}
}

 

GetFileAttributeEx 设置文件属性

用来改变文件的属性

BOOL GetFileAttributesExA(
LPCSTR                 lpFileName,
GET_FILEEX_INFO_LEVELS fInfoLevelId,
LPVOID                 lpFileInformation
);

第二个参数