C# のアナログが必要です
Directory.CreateDirectory("d:\\asd\\dsa\\123");
これにより、ディスク D が完全に空でディレクトリがまったくない場合でも、すべてのディレクトリが作成されます。
次の WinApi CreateDirectory について読み
ました。
だからそれは私が探しているものではありません..
私がやりたいことをする他の方法はありますか?
mkdir()
関数を使用しようとしましたか? 別の使用方法:
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";
}
Win XP(SP2)以降のSHCreateDirectoryEx関数。ただし、これは 247 文字に制限されており、他の Win32 API ファイルシステム関数がサポートする標準の MAX_PATH (260) より少ないです。
32,767
ワイド文字に拡張するには、関数の Unicode バージョンを呼び出し、"\\?\"
プレフィックスをパスに追加します。注: ほとんどの Boost.Filesystem 操作関数は、クラス パス オブジェクトの内容を Windows API に渡すだけなので、拡張長のプレフィックスを使用して機能します。ただし、Windows によって課される制限のため、一部は機能しません。-- ブースト警告。
特定のコンパイラ ベンダーがその目的のために独自の RTL 関数を提供しているかどうかを確認してください。たとえば、Delphi/C++Builder にはForceDirectories()
利用可能な関数があります。
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);
};