• ベストアンサー

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/17070)
回答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