首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++/MFC 判斷有效檔案路徑完整實作 (IsValidFileName)

     編輯:關於C++

功能說明

驗證給定的字串是否為合法的 Windows 檔案完整路徑。支援自訂副檔名檢查(傳入 "*" 表示不限制副檔名)。

驗證規則

  1. 路徑長度 > 0。
  2. 目錄部分必須存在(若包含路徑分隔符)。
  3. 檔名不得包含非法字元:\ / : , ; * ? " < > |。
  4. 檔名長度 > 0。
  5. 若指定副檔名(非 "*"),檢查是否符合;不符則自動補全。

完整程式碼 (MFC CString 版)

// 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("路徑不合法"));
}

設計重點與擴充建議

  • Unicode 相容:使用 TCHAR 與 _T() 宏,支援 ANSI/Unicode 雙版本編譯。
  • 副檔名大小寫不敏感:採用 CompareNoCase。
  • 目錄判斷:呼叫 Win32 API GetFileAttributes,需包含 <windows.h>。
  • 擴充性:可加入最大路徑長度 (260/32767) 檢查、保留字元檢查 (CON, PRN, AUX...)、UNC 路徑支援等。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved