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