整理: 文件操作

来源:互联网 发布:卡密社区外包系统源码 编辑:程序博客网 时间:2024/05/16 06:00

 <2011_0809_2059>

验证 SetFileAttributes 在文件打开过程中执行的效果

/** * @file testFile.cpp* @brief 验证文件打开过程中, SetFileAttributes的执行效果*/#include "stdafx.h"#include <windows.h>int _tmain(int argc, _TCHAR* argv[]){INT iRc = S_OK;BYTE ucBuf[MAX_PATH];DWORD dwReadBytes = 0;HANDLE hFile = INVALID_HANDLE_VALUE;CONST TCHAR * pcPathName = _T("c:\\test.txt");_tprintf(_T("object file is [%s]\n"), pcPathName);ZeroMemory(ucBuf, MAX_PATH);hFile = CreateFile(pcPathName,  // file name GENERIC_READ,                   // open for reading 0,                              // do not share NULL,                           // default security OPEN_EXISTING,                  // existing file only FILE_ATTRIBUTE_NORMAL,   // normal file NULL);                          // no template if ((NULL == hFile)||(INVALID_HANDLE_VALUE == hFile)){ _tprintf(_T("CreateFile error\n"));iRc = S_FALSE;goto END;}if(!ReadFile(hFile, ucBuf, sizeof(ucBuf), &dwReadBytes, NULL)){_tprintf(_T("ReadFile error\n"));iRc = S_FALSE;goto END;}/** 模拟错误操作, * 看实验结果, SetFileAttributes在文件打开过程中, 也能正常执行, 不会报错* 在程序执行之前, 把pcPathName指向的文件设成"只读, 隐藏", * 程序执行之后, pcPathName指向的文件属性没有了"只读, 隐藏"*/try{SetFileAttributes(pcPathName, FILE_ATTRIBUTE_NORMAL);}catch(...){_tprintf(_T("SetFileAttributes error\n"));iRc = S_FALSE;goto END;}END:if(INVALID_HANDLE_VALUE != hFile){CloseHandle(hFile);hFile = INVALID_HANDLE_VALUE;}if(S_OK != iRc){_tprintf(_T("error happen\n"));}_tprintf(_T("END\n"));getchar();return 0;}

切分文件全路径

    BOOL SplitFilePathName(        const WCHAR * pcPathName,        std::wstring & strDriver,        std::wstring & strDir,        std::wstring & strFileNamePrefix,        std::wstring & strFileNamePostfix)    {        WCHAR szPathName[MAX_PATH] = L"\0";        WCHAR szDriver[MAX_PATH] = L"\0"; /// 这个缓冲区要整大点, 要不执行结果不对.        WCHAR szDir[MAX_PATH] = L"\0";        WCHAR szFileNamePrefix[MAX_PATH] = L"\0";        WCHAR szFileNamePostfix[MAX_PATH] = L"\0";        if (NULL == pcPathName)            return FALSE;        _tcscpy(szPathName, pcPathName);        // _splitpath 的反函数_makepath        _tsplitpath(szPathName,            szDriver,            szDir,            szFileNamePrefix,            szFileNamePostfix);        strDriver = szDriver;        strDir = szDir;        strFileNamePrefix = szFileNamePrefix;        strFileNamePostfix = szFileNamePostfix;        /** note          * csPathName = c:\subDir1\subDir2\subDir3\test1.dat  * csDriver = c:          * csDir = \subDir1\subDir2\subDir3\          * csFileNamePrefix = test1          * csFileNamePostfix = .dat        */        return TRUE;    }

<2014_0817>

建立一个指定size的空文件

    BOOL CreateFileBySize(const WCHAR * pcFilePathName, LONGLONG llFileSize)    {        BOOL bRc = FALSE;        LARGE_INTEGER LintSizeIn;        LARGE_INTEGER LintSizeOut;        HANDLEhfile = INVALID_HANDLE_VALUE;        if (NULL == pcFilePathName)            return FALSE;        LintSizeIn.QuadPart = llFileSize;        LintSizeOut.QuadPart = 0;        hfile = CreateFile(pcFilePathName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);        if (INVALID_HANDLE_VALUE == hfile)            return FALSE;        bRc = ::SetFilePointerEx(hfile, LintSizeIn, &LintSizeOut, FILE_BEGIN);        _ASSERT(bRc);        if (bRc)        {            bRc = ::SetEndOfFile(hfile);            _ASSERT(bRc);        }        SAFE_CLOSE_HANDLE(hfile);        return bRc;    }

附加一个文件到另外一个文件

    BOOL AppendFile2File(const WCHAR * pcFileDst, const WCHAR * pcFileSrc, BOOL bCreateNewDst)    {        BOOL        bRc = FALSE;        LONGLONG    llFileSizeDst = 0;        HANDLE    hfileDst = INVALID_HANDLE_VALUE;        HANDLE      hfileSrc = INVALID_HANDLE_VALUE;        LARGE_INTEGER LintPos;        UCHAR*      pBuf = NULL;        DWORD       dwBufRdBk = 0;        DWORD       dwBufWrBk = 0;        const DWORD dwBufSize = (long)1 * 1024 * 1024; ///< 1MB        LintPos.QuadPart = 0;        if (bCreateNewDst)        {            if (!CreateEmptyFile(pcFileDst))                return FALSE;        }        if (!ns_base::IsFileExist(pcFileDst)            || !ns_base::IsFileExist(pcFileSrc))        {            return FALSE;        }        /// open file dst        llFileSizeDst = ns_base::GetFileSize(pcFileDst);        hfileDst = CreateFile(pcFileDst, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);        if (INVALID_HANDLE_VALUE == hfileDst)        {            goto END_AppendFile2File;        }        if (llFileSizeDst > 0)        {            if (!SetFilePointerEx(hfileDst, LintPos, NULL, FILE_END))                goto END_AppendFile2File;        }        /// open file src        hfileSrc = CreateFile(pcFileSrc, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);        if (INVALID_HANDLE_VALUE == hfileSrc)        {            goto END_AppendFile2File;        }        pBuf = new UCHAR[dwBufSize];        do         {            if (!::ReadFile(hfileSrc, pBuf, dwBufSize, &dwBufRdBk, NULL))                goto END_AppendFile2File;            if (!::WriteFile(hfileDst, pBuf, dwBufRdBk, &dwBufWrBk, NULL))                goto END_AppendFile2File;            if (dwBufWrBk != dwBufRdBk)                goto END_AppendFile2File;        } while (dwBufRdBk > 0);        bRc = TRUE;END_AppendFile2File:        SAFE_CLOSE_HANDLE(hfileDst);        SAFE_CLOSE_HANDLE(hfileSrc);        SAFE_DELETE_ARRAY(pBuf);        return bRc;    }

    BOOL CreateEmptyFile(const WCHAR * pcFilePathName)    {        HANDLEhfile = INVALID_HANDLE_VALUE;        if (NULL == pcFilePathName)            return FALSE;        hfile = CreateFile(pcFilePathName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);        if (INVALID_HANDLE_VALUE == hfile)            return FALSE;        SAFE_CLOSE_HANDLE(hfile);        return TRUE;    }