/**
* @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;
}