驗證給定的字串是否為合法的 Windows 檔案完整路徑。支援自訂副檔名檢查(傳入 "*" 表示不限制副檔名)。
\ / : , ; * ? " < > |。"*"),檢查是否符合;不符則自動補全。// CommonFunc.h
class CCommonFunc {
public:
// 驗證檔案完整路徑
// strP: 輸入/輸出路徑(可能被修正補全副檔名)
// strExt: 允許的副檔名(含點號,如 ".txt"),"*" 表不限制
// 回傳: TRUE=合法, FALSE=不合法
static BOOL S_IsValidFileName(CString& strP, const CString& strExt);
// 輔助:判斷目錄是否存在
static BOOL S_IsDirectory(const CString& strDir);
};
// CommonFunc.cpp
BOOL CCommonFunc::S_IsValidFileName(CString& strP, const CString& strExt) {
// 1. 去除首尾空白
strP.TrimLeft(); strP.TrimRight();
// 2. 長度檢查
if (strP.GetLength() <= 0) return FALSE;
// 3. 找最後一個路徑分隔符
int pos1 = strP.ReverseFind('\\');
int pos2 = strP.ReverseFind('/');
int pos = max(pos1, pos2);
// 4. 目錄存在性檢查
if (pos >= 0 && pos < strP.GetLength()) {
CString strDir = strP.Left(pos);
if (!S_IsDirectory(strDir)) return FALSE;
// 5. 取得純檔名部分
CString strFileName = strP.Mid(pos + 1);
if (strFileName.IsEmpty()) return FALSE;
// 6. 檔名非法字元檢查
static const TCHAR* INVALID_CHARS = _T("\\/:,;*?\"<>|");
if (strFileName.FindOneOf(INVALID_CHARS) != -1) return FALSE;
// 7. 副檔名檢查與補全
if (strExt.CompareNoCase(_T("*")) != 0) {
CString curExt = strP.Right(strExt.GetLength());
if (curExt.CompareNoCase(strExt) != 0) {
strP += strExt; // 自動補全
}
}
return TRUE;
}
// 無目錄部分(純檔名),視為當前目錄
if (strP.FindOneOf(_T("\\/:,;*?\"<>|")) != -1) return FALSE;
if (strExt.CompareNoCase(_T("*")) != 0) {
CString curExt = strP.Right(strExt.GetLength());
if (curExt.CompareNoCase(strExt) != 0) strP += strExt;
}
return TRUE;
}
BOOL CCommonFunc::S_IsDirectory(const CString& strDir) {
if (strDir.IsEmpty()) return TRUE; // 相對路徑視為當前目錄
DWORD attr = GetFileAttributes(strDir);
return (attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY));
}
CString path = _T("C:\\Data\\test");
CString ext = _T(".log");
if (CCommonFunc::S_IsValidFileName(path, ext)) {
// path 可能已被修正為 "C:\\Data\\test.log"
AfxMessageBox(_T("合法路徑: ") + path);
} else {
AfxMessageBox(_T("路徑不合法"));
}
TCHAR 與 _T() 宏,支援 ANSI/Unicode 雙版本編譯。CompareNoCase。GetFileAttributes,需包含 <windows.h>。