2010-11-26 17 views
8

ディレクトリが既にMFC(VC++)に存在するかどうかをチェックする方法? 私は現在のアプリケーションのパスを取得するために、以下のコードを使用しています。NDSLogフォルダを作成しています。 すべてのログファイルがそこに置かれるようにしてください。NDSLogフォルダが既に存在するかどうかを確認してください。ディレクトリが既にMFC(VC++)に存在するかどうかをチェックする方法?

ありがとうございました。

char strPathName[_MAX_PATH]; 
    ::GetModuleFileName(NULL, strPathName, _MAX_PATH); 

    // The following code will allow you to get the path. 
    CString newPath(strPathName); 
    int fpos = newPath.ReverseFind('\\'); 

    if (fpos != -1) 
    newPath = newPath.Left(fpos+1);  
    newPath += "NDSLog\\" ; 

    CreateDirectory(newPath,NULL); 
+5

ログをカレントディレクトリの下に置かないようにすることはできますか? VistaおよびWindows 7では、非昇格(通常の言い換えれば)アプリケーションは、Program Filesの下のどこにでも書き込むことができません。このコードを今日作成しているので、Windows用に書いているので、ログにはAppData(CSIDL_APPDATA)を使用してください。あなたのアプリのサブディレクトリを作成し、そのログの下にある別のものが好きな場合は、 –

答えて

22

ファイル/ディレクトリが存在するかどうかを確認する最も簡単な方法は、GetFileAttributesを使用することですファイルにアクセスするには、戻り値CreateDirectoryを確認して成功したことを確認する必要があります。

実際には、ディレクトリがすでに存在するかどうかを確認する必要はありません。ディレクトリがすでに存在する場合CreateDirectoryは、エラーコードを設定します:

if (!CreateDirectory(newPath,NULL)) { 
    if (GetLastError() == ERROR_ALREADY_EXISTS) { 
    // directory already exists 
    } else { 
    // creation failed due to some other reason 
    } 
} 
+1

どちらの解決策も、作成するディレクトリと同じ名前の(通常の)ファイルがあるかもしれないことを考慮していません:最初のアプローチ( 'GetFileAttributes()')は、 "directory"属性戻り値!= 'INVALID_FILE_ATTRIBUTES'の場合に設定されます。その後、ディレクトリは実際には既に存在します。そうしないと、同じ名前の通常のファイルがディレクトリの作成を妨げます。 2番目のアプローチでも同じです: 'CreateDirectory()'は、通常のファイル(ディレクトリではない)が既に存在する場合は、 'ERROR_ALREADY_EXISTS'を返します。 –

0

FindFirstFile。名前に「ファイル」があるにもかかわらず、ディレクトリが完全にうまく見つかるでしょう。

0

_acceesまたは_waccessは、Cランタイムから使用できます。 This is the msdn page and you can see sample usage また、CreateDirectoryが存在する場合はERROR_ALREADY_EXISTSをチェックして返すため、ディレクトリがすでに存在する場合はそれほど心配する必要はありません。それが失敗しても機能は、そのような権限を持っていないとして、何らかの他の理由にINVALID_FILE_ATTRIBUTESを返すこと

if (GetFileAttributes(newPath) == INVALID_FILE_ATTRIBUTES) { 
    CreateDirectory(newPath,NULL); 
} 

注:You can see from here (Return Codes).

1

私はPathFileExistsを使用しています。

0

ファイルがネットワークパスの場合、GetFileAttributesが遅く動作することに注意する必要があります。 実際には、初めて低速で動作し、後で高速動作します。

1

PathIsDirectory()?元の例では、PathRemoveFilespec()の後にPathCombine()を付けて、新しいファイル名/拡張子を追加することができます。ターゲットがWindows 8以降の場合は、より安全なPathCch...()の機能があります。

関連する問題