整理: 文件操作

/** * @name GetTempFolder * @brief 得系统的临时文件夹的位置 */ BOOL GetTempFolder(CString &strTempFolder) { PCHAR pcTmp = NULL; pcTmp = strTempFolder.GetBuffer(MY_PATH_LEN_MAX); GetTempPath(MY_PATH_LEN_MAX, pcTmp); strTempFolder.ReleaseBuffer(); TRACE("%s/n", strTempFolder); /** @note run results * C:/DOCUME~1/LOSTSP~1/LOCALS~1/Temp/ */ return TRUE; }

SCODE fnTempFileTest() { /** * 建立一个临时文件, 当文件句柄被关闭时, 文件被系统自动删除 */ HANDLE hFile = CreateFile( "c://tmp//tempfile.txt", 0, 0, NULL, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, NULL); if((!hFile) && (hFile == INVALID_HANDLE_VALUE)) { AfxMessageBox("文件建立失败"); return S_FALSE; } //文件已经创建成功, 在磁盘上可以看到该文件 //文件操作... CloseHandle(hFile); //到这里, 创建的文件已经被系统自动删除了 return S_OK; }

 <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;

        HANDLE	hfile = 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)
    {
        HANDLE	hfile = 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;
    }



你可能感兴趣的:(整理: 文件操作)