• ベストアンサー

MkDir関数

VBでフォルダを作成する、基本的なロジックを作成しています。 現在、仮にD:\にはフォルダが存在しないとして、 MkDir "D:\Test\Temp\" とするとエラーになってしまいます。 MkDir "D:\Test\" とするとフォルダが作成されるのですが、 その後に、 MkDir "D:\Test\Temp\" とすると、やはりエラーになってしまいます。 どのようにすれば、1つの処理の中で、複数階層のフォルダが作成できるのでしょうか? ちなみにVB6.0 SP5で、実際にはMkDir関数の引数は文字列変数です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • takasebou
  • ベストアンサー率42% (61/144)
回答No.7

うーん。下の方法で出来ない事はないと思うのですが。 コードがあっていると仮定した場合、もしかしてフロッピーなどのアクセスが非常に遅いメディアに対して行っているという事はないですか? その場合、少しウェイトをおいてあげないと間に合わない可能性はあります。フォルダ作成は実際はWindowsがやっていますが、ファイル操作関連は遅延書き込みを行っている為、コード上では終了していても、実際にはまだフォルダが出来ていないという事も考えられます。 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) を宣言して MkDir "D:\Test\" Call sleep(500) '0.5秒まつ。待ってる時間に別に根拠はないので適当なものにかえてください。 MkDir "D:\Test\Temp\" とかやってみてはどうでしょう? あとは  Private Sub mMakeDir() On Error Goto ErrChk MkDir "D:\Temp\Test\" Exit Sub ErrChk: Debug.Print Err.Description End Sub などのコードを書いて、なぜエラーになっているかをチェックしてはどうでしょう?(Err.Description はエラーオブジェクトの直前におきたエラーの内容を表示します) 案外思っていない事でエラーになっているかもしれません。 それでも駄目なら、MkDirなどのOSよりのファイル操作コマンドは使わずに、FileSystemObjectを使ってみてはどうでしょう? Dim aoFso As Object ' File System Object On Error GoTo ErrChk Set aoFso = CreateObject("Scripting.FileSystemObject") Call aoFso.CreateFolder("D:\Temp\") Call aoFso.CreateFolder("D:\Temp\Test\") ErrChk: Set aoFso = Nothing End Sub ※エラーチェックをいれているのは、フォルダ作成に失敗しても、オブジェクトを確実に解放する為。 DirやMkDirなどのOSよりのファイル操作コマンドは、コードが正しくても時々理不尽な失敗をするので、そのせいかもしれません。

hiro_sun
質問者

お礼

みなさん、ご回答ありがとうございました。 とくにサンプルソースなどは大変参考になります。 質問内容についてはいまだになぞのままなんですが・・・

その他の回答 (6)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

>MkDirは、1階層下のフォルダを作成するので そうでもないのでは。 MkDir "D:\Test\Temp\"はTestフォルダがない段階でエラーになるのでは?。 ーーーー 中間ディレクトリを作成することが出来ます。 batというディレクトリ配下にcommandというディレクトリがあり(こここに注意)、その配下にmdというディレクトリがあるディレクトリ構造を作成するには mkdir \bat\command\md というように書きます。 http://www.confrage.com/dos/command/md/md.html ーーーーーー >MkDir "D:\Test\" >MkDir "D:\Test\Temp\"は¥不要では?

  • OsieteG00
  • ベストアンサー率35% (777/2173)
回答No.5

当方の環境ではできますので、単純なエラーかも。 セミコロンだったり、\マークが抜けていたり、前後のmkdirで親ディレクトリがなかったり。フルパスでの指定ですよね?

回答No.4

ちなみに自分はこんな感じで作っているのでが、 どうでしょうか? Dim vPath As String 'パス Dim strFile As String '検索等で使用 Dim strdir As String 'ディレクトリ作成で使用 Dim strmkdir() As String 'ディレクトリ作成 Dim lngI As Long 'ループカウンタ vPath=D:\Test\Temp '★ディレクトリの作成処理 strmkdir = Split(vPath, "\") '\ごとに区切る For lngI = LBound(strmkdir) To UBound(strmkdir)   If lngI <> 0 Then     strdir = strdir & "\" & strmkdir(lngI)   Else     strdir = strdir & strmkdir(lngI)   End If   '指定されたフォルダがない場合は作成する   strFile = Dir(strdir, vbDirectory)   If Len(Trim(strFile)) = 0 Then     MkDir strdir   End If Next lngI

  • hawkwind
  • ベストアンサー率34% (160/469)
回答No.3

ディレクトリを複数階層新規に作成する場合は 順番に作成していけばできます。 飛び越しで2階層以上を一度に作成しようとするとエラーになります。 なので後者の方法でできるはずですが、何か勘違いはありませんか? なお、引数は文字列変数とのことなので、 ループ内での"\"の判定が必要になります。 後日でしたら私の方でもコードを確認することはできるのですが・・・

  • jurarumin
  • ベストアンサー率34% (190/544)
回答No.2

MkDirは、1階層下のフォルダを作成するので MkDir "D:\Test" MkDir "D:\Test\Temp" で「D:\Test\Temp」のフォルダは作成できますよ。 ただし、既に「D:\Test\Temp」が存在している場合は 同じフォルダを作成しようとしてエラーとなります。 作成前に、以下の判定式を使ってみたらどうでしょう。 Dim strDirName As String strDirName = Dir("D:\Test\Temp", vbDirectory) If strDirName <> "" Then    MsgBox "既にフォルダが存在しています。" Else    MkDir "D:\Test"    MkDir "D:\Test\Temp" End If

hiro_sun
質問者

お礼

回答ありがとうございます。 >MkDirは、1階層下のフォルダを作成するので そのようですね。 で、2回に分けて作成しているのですが、やはりエラーになってしまいます。 ちなみに、このPGでは作成するフォルダは必ず存在しない前提で実行されます。 (存在する場合は実行されません)

  • OsieteG00
  • ベストアンサー率35% (777/2173)
回答No.1

MkDir "D:\Test" のエラーチェックをして、なかったら MkDir "D:\Test\Temp" 最後の\マークをはずして試してみてください。

参考URL:
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vafctMkDir.asp
hiro_sun
質問者

お礼

回答ありがとうございます。 説明が不足して申し訳ありません。 MkDir "D:\Test\Temp" でも同じエラーです。 エラー内容は"パスが見つかりません"です。

関連するQ&A

  • フォルダを一括で作成したいのです(階層がある分)。

    フォルダを一括で作成したいのです(階層がある分)。 添付画像(例) AからF列までのデータがあります。 G列のように「う\え\お」の階層で作成したいのです。 そこまで作成すればフォルダ作成ソフトかmkdirコマンドで作成しようと考えています。 関数ではできないでしょうか(VBでしないとだめでしょうか?)。

  • フォルダを一括で作成したいのです(階層がある分)。

    フォルダを一括で作成したいのです(階層がある分)。 添付画像(例) A列からF列までのデータがあります。 G列のように「う\え\お」の階層で作成したいのです。 それをmkdirコマンドで作成しようと考えています。 関数で考えたのですがどうもうまくいかないようなのでVB等でできませんでしょうか。 実際ファイル名はまだ長く、データの行もかなりあります。 A列からE列は数字ではなく文字列です。

  • 関数の引数

    こんにちわ。 ご存知の方、ご教授してもらえないでしょうか? VB.net2005を使っているのですが 関数の引数に変数をセットして、別関数で 引数に対してデータをセットすることは可能でしょうか? C言語でいうところのポインタを引数に渡し ポインタアドレスに書き込むような処理はVB.netでは 可能なんでしょうか? 下記のような事は試したのですが、うまく出来ませんでした(。。; public sub test1() dim mojiretu as string test2( mojiretu ) msgbox(mojiretu) end sub public sub test2( str as string) str = "文字列" end sub

  • Linux mkdirでサブフォルダごと作成

    Linuxでファイルを転送するシェルを作成しております。 コピー元と同じ階層構造でコピーしたいのですが、 ftp内で mkdir をする時にオプションの -p は使えないのでしょうか? さきほどやってみたのですが、うまくいきません。 Target="share/1G/1T" ftp -i -v -n 10.156.1.xxx <<END user UserName PW bin mkdir -p $Target *1G/1Tというフォルダを一気に作成したい。 cd $Target #put $Target/test.txt /Target/test.txt bye END ftpのコピー先に、フォルダ階層をいっきに作成する方法はありますでしょうか?

  • C言語でのディレクトリ作成についての質問です。

    C言語でのディレクトリ作成についての質問です。 Linuxコマンドのmkdir -pコマンドのようなことをC言語で実現したいのですが、 mkdir(dir1/dir2)のようにすると、エラーになってしまいます。 mkdir(dir1)のように階層でないディレクトリを指定した場合はうまくいくのですが・・・ mkdir関数では階層ディレクトリを1度で作成できないのでしょうか。 ディレクトリをたどってmkdirを1回ずつ使用しなければいけないのか、 階層ディレクトリを指定できる関数がほかにあるのか、 ご教授お願いいたします。

  • Linuxで深い階層のフォルダを作成したい

    Linuxで深い階層のフォルダを作成したいのですが、通常のmkdirではエラーが出ます。良いモジュールはありますか?

    • ベストアンサー
    • Perl
  • fstream型オブジェクトを関数の仮引数にする

    こんにちは。 現在、C++を使ってプログラミングをしているのですが、fstream型・ifstream型・ofstream型のオブジェクトを、関数の仮引数にするにはどうすればよいのか分からず困っています。 具体的に言いますと、まず、main関数の中で fstream file("test.txt"); のように、fstream型オブジェクトfileを定義しておき、これを以下のような関数に渡して、関数の内部で使いたいのです。 (以下の関数は、ファイルの内容を、1つの文字列変数に格納するためのものです。) ________________________________________________________________________________________________________________________ void file_to_str(fstream file, char *str){ const int size=10000; str=""; //初期化しとかないとダメ。 char temp[size]=""; //初期化しとかないとダメ。 while(!file.eof()){ file.getline(temp, size); //改行に出会うかsize個の文字を読み込むまで、 //文字をバtemp)に読み込む。 strcat(str, temp); if(!file.eof()){ strcat(str, "\n"); //getline()関数は改行をバッファに読み込まない。 } } } ________________________________________________________________________________________________________________________ この関数を、main関数でfstream file("test.txt"); と記述した直後で呼び出した所、以下のようなエラーが出ました。 ________________________________________________________________________________________________________________________ エラー E2247 file_to_str.cpp 48: 'ios::basic_ios(const ios &)' はアクセスできな い(関数 fstream::basic_fstream(fstream &) ) エラー E2247 file_to_str.cpp 48: 'ios::basic_ios(const ios &)' はアクセスできな い(関数 iostream::basic_iostream(iostream &) ) エラー E2125 file_to_str.cpp 48: コンパイラは 'copy constructor' クラスの istrea m を作成できない(関数 iostream::basic_iostream(iostream &) ) エラー E2125 file_to_str.cpp 48: コンパイラは 'copy constructor' クラスの ostrea m を作成できない(関数 iostream::basic_iostream(iostream &) ) ________________________________________________________________________________________________________________________ 何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。 (「このプログラムの場合は、FILE型ポインタで代用できる。」といった答え以外でお願い致します。) では、よろしくお願い致します。

  • DIR関数について教えてください。

    現在、テキストボックスに入力した文字が、テキストファイル等の中身に存在するかを調べるプログラムの問題を解いているのですが。 選択したフォルダの下の階層にある全てのフォルダに対しても 検索を行うプログラミングでかなり悩んでいます。 特に、Dir関数の意味が???です。 例えば現在のパスをC:\テスト01\テスト02\としたときに、 変数Mypathに Mypath=C:\テスト01\テスト02\と代入して、 変数MyNameに MyName = Dir(setPath & "*.*", vbDirectory)とすると 変数MyNameには、1回目は"."が入り、2日目は".."が入ります。 なぜ、"."や".."が入るのか分からず悩んでいます。 "."は、現在のフォルダを表して、".."は親(1つ上)のフォルダを表していると、 と言うことは、ヘルプを調べて分かったのですが。 なぜ?こういった値が入るのか理解できない状態です。 3回目は、まともなファイル名が(例えばtest.txt)などのちゃんとした ファイル名が入ってくれるのですが。 特に、".."(親フォルダ)をなぜ見に行くのか??よく分かっていません。 良かったら教えてください。 よろしくお願いします。m(__)m

  • キーボードから入力される文字を受け取る関数?

    VB 2008 でキーボードから入力される文字を受け取る関数の作成は可能でしょうか? Module Main   Sub Main()     Dim nc As Long     nc = 0     While FileSeek("D:\Temp\Test.txt", nc + 1) <> ""       nc = nc + 1     End While     Debug.Print(nc)   End Sub End Module △ While FileSeek("D:\Temp\Test.txt", nc + 1) <> "" ○ While GetChar() <> "" もちろん、GetCharってのはありますので同じ名前では無理。 でも、こういう関数を欲している訳です。 OKWaveに助けられて FileSeek()ってのを作成しました。 が、これはファイルから1文字づつ読む関数。 欲している関数とは違います。 VB 2008Expressをダウンロードし某テキストの例題を初めから演習しています。 なにせ、プログラマでもないのに初めての言語ということで悪戦苦闘です。 そして、今、僅かに3題目。 宜しくお願いします。 なお、コンソールではなくWindowsアプリケーションで演習中です。

  • ユーザ関数で引数省略は可能ですか?

    Javascriptの関数でデフォルト値は設定できますか? 下記の書き方ですと関数の呼出し側で、引数を省略した際 エラーになってしまいます。 test1(1,2); test1(1,2,3); test1(1,2,3,4); function test1(a,b,c=1,d=1) { alert (c); alert (d); }

専門家に質問してみよう