文件屬性相關
1.判斷文件是否存在
利用CFile類和CFileStatus類判斷
CFileStatus filestatus;
if (CFile::GetStatus(_T("d:\\softist.txt"), filestatus))
AfxMessageBox(_T("文件存在"));
else
AfxMessageBox(_T("文件不存在"));
利用CFileFind類判斷
CFileFind filefind;
CString strPathname = _T("d:\\softist.txt");
if(filefind.FindFile(strPathname))
AfxMessageBox(_T("文件存在"));
else
AfxMessageBox(_T("文件不存在"));
利用API函數FindFirstFile判斷,這個函數還可以判斷文件屬性,日期,大小等屬性。例:
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind = FindFirstFile(_T("d:\\softist.txt"), &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("文件不存在"));
}
else
{
AfxMessageBox(_T("文件存在"));
FindClose(hFind);
}
2.文件日期操作。下面是取得"d:\\softist.txt"的文件修改時間,TRACE以後,再把文件修改時間改成 2000-12-03 12:34:56。
HANDLE hFile;
FILETIME filetime;
FILETIME localtime;
SYSTEMTIME systemtime;
hFile = CreateFile(_T("d:\\softist.txt"), GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
GetFileTime(hFile, NULL, NULL, &filetime); //取得UTC文件時間
FileTimeToLocalFileTime(&filetime, &localtime); //換成本地時間
FileTimeToSystemTime(&localtime, &systemtime); //換成系統時間格式
TRACE("%04d-%02d-%02d %02d:%02d:%02d\r\n",
systemtime.wYear, systemtime.wMonth, systemtime.wDay,
systemtime.wHour, systemtime.wMinute, systemtime.wSecond);
//把文件時間修改成 2000-12-03 12:34:56
systemtime.wYear = 2000; systemtime.wMonth = 12; systemtime.wDay = 3;
systemtime.wHour = 12; systemtime.wMinute = 34; systemtime.wSecond = 56;
SystemTimeToFileTime(&systemtime, &localtime); //換成文件時間格式
LocalFileTimeToFileTime(&localtime, &filetime); //換成UTC時間
SetFileTime(hFile, NULL, NULL, &filetime); //設定UTC文件時間
CloseHandle(hFile);
}
3.設置文件屬性
BOOL SetFileAttributes( LPCTSTR lpFileName, DWORD dwFileAttributes );
dwFileAttributes 的意義
FILE_ATTRIBUTE_ARCHIVE 保存文件
FILE_ATTRIBUTE_HIDDEN 隱藏文件
FILE_ATTRIBUTE_NORMAL 通常文件
FILE_ATTRIBUTE_READONLY 只讀文件
FILE_ATTRIBUTE_SYSTEM 系統文件
例:
SetFileAttributes(_T("d:\\softist.txt", FILE_ATTRIBUTE_READONLY);
文件的複製,移動,刪除,更名
1.文件的複製API
BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists);
bFailIfExists用來制定如果目標文件已經存在時,是否中止複製操作,返回FALSE。例,把"d:\\softist1.txt"複製到"d:\\softist2.txt",即使"d:\\softist2.txt"已經存在。
BOOL bRet = CopyFile(_T("d:\\softist1.txt"), _T("d:\\softist2.txt"), FALSE);
|
|
|
2.文件的移動API
BOOL MoveFile( LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName );
這個函數可以移一個文件,或目錄(包括子目錄),例,
MoveFile(_T("d:\\softist.txt"), _T("d:\\softist2.txt"));
下面的API帶着選項dwFlags ,移動文件,或目錄(包括子目錄)。
BOOL MoveFileEx( LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, DWORD dwFlags );
dwFlags的意義:
MOVEFILE_REPLACE_EXISTING 如果目標文件存在是否替代它 。
MOVEFILE_DELAY_UNTIL_REBOOT 文件移動準備,下次啓動系統時執行移動作業。
3.刪除文件
API:
BOOL DeleteFile( LPCTSTR lpFileName );
MFC:
static void PASCAL CFile::Remove(LPCTSTR lpszFileName);
4.文件更名MFC:
TCHAR* pOldName = _T("Oldname_File.dat");
TCHAR* pNewName = _T("Renamed_File.dat");
try
{
CFile::Rename(pOldName, pNewName);
}
catch(CFileException* pEx )
{
TRACE(_T("File %20s not found, cause = %d\n"), pOldName,
pEx->m_cause);
pEx->Delete();
}
遍歷文件目錄
遍歷文件目錄,即把一個目錄裏的文件以及子目錄裏的文件名都取出來。本文是CFileFind類的使用例的筆記。下面的程序是從一個目錄出發,把這個目錄裏的所有成員按着層次TRACE到DEBUG輸出畫面。
void TravelFolder(CString strDir, int nDepth)
{
CFileFind filefind; //聲明CFileFind類型變量
CString strWildpath = strDir + _T("\\*.*"); //所有文件都列出。
if(filefind.FindFile(strWildpath, 0)) //開始檢索文件
{
BOOL bRet = TRUE;
while(bRet)
{
bRet = filefind.FindNextFile(); //枚舉一個文件
if(filefind.IsDots()) //如果是. 或 .. 做下一個
continue;
for (int i = 0; i < nDepth; i ++) //層次空格打印
{
TRACE(_T(" "));
}
if(!filefind.IsDirectory()) //不是子目錄,把文件名打印出來
{
CString strTextOut = strDir + CString(_T("\\")) + filefind.GetFileName();
TRACE(_T("file = %s\r\n"), strTextOut);
}
else //如果是子目錄,遞歸調用該函數
{
CString strTextOut = strDir + CString(_T("\\")) + filefind.GetFileName();
TRACE(_T("dir = %s\r\n"), strTextOut);
TravelFolder(strTextOut, nDepth + 1);//遞歸調用該函數打印子目錄裏的文件
}
}
filefind.Close();
}
}
//測試,把d盤的\temp裏的所有文件和子目錄打印到DEBUG輸出畫面。
void Test()
{
TravelFolder(CString(_T("d:\\temp")), 0);
}
文件目錄操作
1.創建目錄(API)
BOOL CreateDirectory(LPCTSTR pstrDirName);//pstrDirName是全路徑
2.刪除目錄(API)
BOOL RemoveDirectory( LPCTSTR lpPathName );
3.判斷目錄是否存在(Shell Function)
#include <shlwapi.h>#pragma comment(lib, "shlwapi.lib") if (PathIsDirectory(_T("d:\\temp"))) AfxMessageBox(_T("存在"));else AfxMessageBox(_T("不存在"));
|
|
|
4.取得當前目錄(API)
DWORD GetCurrentDirectory( DWORD nBufferLength, LPTSTR lpBuffer );
5.取得執行文件所在目錄(API)
DWORD GetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize );
6.取得功能目錄(Shell Function)
BOOL SHGetSpecialFolderPath( HWND hwndOwner, LPTSTR lpszPath, int nFolder, BOOL fCreate);
例:讀取我的檔案目錄
TCHAR szDirFile[1024];
memset(szDirFile, 0, sizeof(szDirFile));
BOOL bRet = SHGetSpecialFolderPath(NULL,szDirFile,CSIDL_PERSONAL,true);
if (bRet)
{
AfxMessageBox(szDirFile);
}
7.選擇目錄用的對話框界面
利用Shell Function可以打出選擇目錄用的對話框界面
#include<shlobj.h>
INT CALLBACK _BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM pData)
{
TCHAR szDir[MAX_PATH];
switch(uMsg)
{
case BFFM_INITIALIZED:
// WParam is TRUE since you are passing a path.
// It would be FALSE if you were passing a pidl.
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)pData);