2
#include <iostream>
#include <direct.h>
using namespace std;
int main() {
 if( _mkdir("d:\\a\\b") == 0 ){
   cout << "success";
 }    else if (  _mkdir("d:\\a") == EEXIST ) {
   cout << "Directory was not created because dirname is the name of an existing   file, directory, or device.";
      }
         else if (  _mkdir("d:\\a") == ENOENT ) {
      cout << "Path was not found.";
    }
}

プログラムを実行すると、予期しない出力が発生します。(ほとんどの場合、失敗です。理由はわかりません)

時々私は成功を見る。多くの場合、私\\がシングルスラッシュでダブルスラッシュを削除すると\、メッセージは成功です。このことは私を激怒させています。なぜこうなった ?backslashes問題はありますか?

アップデート

Visual C ++ 2010 Express Editionでは、CTRL + F5を押すと、出力は続行するために任意のキーを押すだけです...

4

4 に答える 4

6

二重スラッシュは正しいです。エラー番号を確認して、失敗している理由を確認してください。

新しいディレクトリが作成された場合、これらの各関数は値0を返します。エラーが発生すると、関数は–1を返し、errnoを次のように設定します
。EEXIST-dirnameは既存のファイル、ディレクトリ、またはデバイスの名前であるため、ディレクトリは作成されませんでした。ENOENT-パスが見つかりませんでした。

ご了承ください:

_mkdirは、呼び出しごとに1つの新しいディレクトリしか作成できないため、dirnameの最後のコンポーネントのみが新しいディレクトリに名前を付けることができます。

考えられる原因:

  • 同じ呼び出しで両方を作成しようとしてaいます(代わりに使用します)bSHCreateDirectoryEx()
  • ディレクトリはすでに存在します
于 2011-06-30T13:10:32.583 に答える
4

あなたは、あなたの場合、失敗が何を意味するのかについてかなり漠然としています。一度に複数のフォルダを作成しようとしているという事実に関連しているのでしょうか?

フォルダを作成できるのは、すでに存在するd:\a\b場合のみです。d:\aそれ以外の場合は、最初に作成してから作成する必要がありd:\aますd:\a\b

これは、任意の深さのディレクトリを正しく作成するために作成したコードです。

于 2011-06-30T13:10:05.697 に答える
1

_mkdirはENOENTまたはEEXISTを返さないことに注意してください。これらは、errno_mkdirの呼び出し後の値です。_mkdirが失敗した場合、ドキュメントに従って常に-1を返します。

http://msdn.microsoft.com/en-us/library/2fkk4dzw(v=vs.80).aspx

于 2011-06-30T13:39:43.300 に答える
0

私もこのエラーを受け取りました。私の場合、_mkdir()実際に戻ってき13 : EACCESSました。理由は定かではありませんが、区切り文字を「\\」から「/」に変更すると、実際に問題が解決しました。このスレッドによると、の動作はmkdir()プラットフォームによって管理されており、私の場合はVC++2012Windows7で使用しています。

更新:問題は区切り文字ではありません。_mkdir()フォルダを作成するために、の結果を確認しながら、その親を再帰的に作成しようとします。作成するC:\1\2には、最初にC:、すでに存在するだけでなく、作成する権限も付与されていないものを作成しようとします。フォルダが存在するかどうかを実際にチェックする前に、フォルダを作成する権限がチェックされているようです。そういうわけで私は得るEACCESS

于 2013-06-22T22:19:52.560 に答える