win32 文件的创建、打开与关闭操作

https://www.cctry.com/thread-298330-1-1.html

文件的创建与打开:CreateFile
    在 Windows系统中,文件的创建与打开都是使用同一个API函数 CreateFile,
    通过传递不同的参数来表示是要创建一个新文件还是要打开一个已经存在的文件
CreateFile定义:
    HANDLE WINAPI CreateFile(
    LPCTSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile
    );
相关参数的解释,咱们进入到API说明文档的帖子中:
https://www.cctry.com/thread-298293-1-1.html

实战:
1、使用 CreateFile 创建一个新的空白文件;
2、使用 CreateFile 打开一个已经存在的文件;
3、使用 CreateFile 打开一个文件,如果文件存在则正常打开,文件不存在则新创建;
4、使用 CreateFile 打开一个文件,如果文件存在则打开并清空内容,文件不存在则新创建


关闭文件句柄:CloseHandle
函数声明如下:
BOOL CloseHandle(
  HANDLE hObject
);

相关参数的解释,咱们进入到API说明文档的帖子中:
https://www.cctry.com/thread-298294-1-1.html



获取文件大小的两种方式:
①、GetFileSize 获得文件大小:
函数详情详见:https://www.cctry.com/thread-298314-1-1.html
//获得小于4GB的文件大小:
DWORD dwSize = GetFileSize(hFile, NULL);


②、GetFileSizeEx 获得文件大小:
函数详情见:https://www.cctry.com/thread-298316-1-1.html

LARGE_INTEGER LargeFileSize = { 0 };
BOOL bRet = GetFileSizeEx(hFile, &LargeFileSize);
lFileSize = LargeFileSize.QuadPart;

 

课后作业:

1、通过本节课学习的知识,封装一个函数,实现判断某个路径的文件是否存在,如果存在则返回TRUE,不存在返回FALSE;
2、封装一个函数,实现清空某个文件的内容,函数执行成功返回TRUE,失败返回FALSE;
3、创建一个具有隐藏属性的文件。

BOOL CheckFileExist(LPCTSTR lpFilePath)
{
        if (!lpFilePath || _tcslen(lpFilePath) < 3) return FALSE;

        HANDLE hFile = CreateFile(lpFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_NOT_FOUND) return FALSE;

        CloseHandle(hFile);
        return TRUE;
}

BOOL ClearFileContent(LPCTSTR lpFilePath)
{
        if (!lpFilePath || _tcslen(lpFilePath) < 3) return FALSE;

        HANDLE hFile = CreateFile(lpFilePath, GENERIC_WRITE, FILE_SHARE_READ, NULL, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hFile == INVALID_HANDLE_VALUE) return FALSE;

        CloseHandle(hFile);
        return TRUE;
}

BOOL CreateHideFile(LPCTSTR lpFilePath)
{
        if (!lpFilePath || _tcslen(lpFilePath) < 3) return FALSE;

        HANDLE hFile = CreateFile(lpFilePath, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL);
        if (hFile == INVALID_HANDLE_VALUE) return FALSE;

        CloseHandle(hFile);
        return TRUE;
}


1、封装一个函数,传入文件路径参数,返回参数指定文件的大小,想想怎么封装这个函数更合理些,返回值要设计下!
2、封装一个函数,实现,把文件大小转换成MB或者GB为单位,带两位小数的字符串;

//函数执行失败返回-1,否则返回文件大小
LONGLONG GetFileSizeExt(LPCTSTR lpFilePath)
{
    if (!lpFilePath || _tcslen(lpFilePath) <= 3) return -1;
    HANDLE hFile = CreateFile(lpFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) return -1;
    LARGE_INTEGER fileSize = { 0 };
    BOOL bRet = GetFileSizeEx(hFile, &fileSize);
    CloseHandle(hFile);
    if (!bRet) return -1;
    return fileSize.QuadPart;
}

BOOL ClearFileContent(LPCTSTR lpFilePath)
{
        if (!lpFilePath || _tcslen(lpFilePath) < 3) return FALSE;

        HANDLE hFile = CreateFile(lpFilePath, GENERIC_WRITE, FILE_SHARE_READ, NULL, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hFile == INVALID_HANDLE_VALUE) return FALSE;

        CloseHandle(hFile);
        return TRUE;
}

 

你可能感兴趣的:(win32)