0

C# のアナログが必要です

Directory.CreateDirectory("d:\\asd\\dsa\\123");

これにより、ディスク D が完全に空でディレクトリがまったくない場合でも、すべてのディレクトリが作成されます。

次の WinApi CreateDirectory について読み
ました。
だからそれは私が探しているものではありません..

私がやりたいことをする他の方法はありますか?

4

3 に答える 3

3

mkdir()関数を使用しようとしましたか? 別の使用方法:

  1. boost filesystem : 標準の MAX_PATH サイズ 260 をサポートします。

    const char dir_path[] = "c:\\temp\\cplusplus";

    boost::filesystem::path dir(dir_path);
            if(boost::filesystem::create_directory(dir)) {
                std::cout << "Success" << "\n";
            }
    
  2. Win XP(SP2)以降のSHCreateDirectoryEx関数。ただし、これは 247 文字に制限されており、他の Win32 API ファイルシステム関数がサポートする標準の MAX_PATH (260) より少ないです。

  3. CreateDirectory 関数: 248 文字のパスのデフォルトの文字列サイズ制限。この制限は、CreateDirectory 関数がパスを解析する方法に関連しています。この制限を32,767ワイド文字に拡張するには、関数の Unicode バージョンを呼び出し、"\\?\"プレフィックスをパスに追加します。

注: ほとんどの Boost.Filesystem 操作関数は、クラス パス オブジェクトの内容を Windows API に渡すだけなので、拡張長のプレフィックスを使用して機能します。ただし、Windows によって課される制限のため、一部は機能しません。-- ブースト警告。

于 2013-10-04T18:21:47.887 に答える
2

特定のコンパイラ ベンダーがその目的のために独自の RTL 関数を提供しているかどうかを確認してください。たとえば、Delphi/C++Builder にはForceDirectories()利用可能な関数があります。

于 2013-10-04T23:44:07.637 に答える
0

Perl/Ruby/Bash では、

    `/bin/mkdir -p $pathname` #perl
    %x(/bin/mkdir -p #{pathname}) #ruby
    /bin/mkdir -p $pathname #bash

システムを呼び出すことができます

    system("mkdir -p pathname");

追加した:

さて、あなたは与えられたパスをパーツに分割し、それぞれのパーツを作りたいと思っています。C で簡単に実行できます (char* と char[] を std::string に変更し、strcat を C++ の += に変更します)。

int MakeDir( char* pathname )
{
    struct stat sbuf;
    if( stat(pathname, &sbuf) < 0 )
    {
        mkdir(pathname,0); //set your permissions as you like in 2nd argument
        return(0);
    }
    else //exists? skip
    {
        //stat.st_mode tells file or dir
        if( S_ISDIR(stat.st_mode) ) { return(0); }
        else if( S_ISREG(stat.st_mode) ) { return(-1); }
        else if( S_ISFIFO(stat.st_mode) ) { return(-1); }
        else if( S_LNK(stat.st_mode) ) { return(0); } //can link to dir
        else { return(-1); }
    }
    return(0);
};
////char PATHSEP = "\/"; //unix/linux //not needed, just use 'mkdir -p'
char PATHSEP = "\\"; //windows
int MkdirPath( char *pathname )
{
    char parts = strdup(pathname);
    char buildpath[strlen(pathname)] = "";
    char* part = strtok(parts,PATHSEP);
    while ( part )
    {
        strcat(pathname, PATHSEP); strcat(pathname, part);
        if( MakeDir( pathname ) < 0 ) { break; }
        part = strtok(NULL,PATHSEP);
    }
    return(0);
};
于 2013-10-04T18:40:58.040 に答える