アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBでフォルダを作成する、基本的なロジックを作成しています。
現在、仮にD:\にはフォルダが存在しないとして、

MkDir "D:\Test\Temp\"

とするとエラーになってしまいます。

MkDir "D:\Test\"

とするとフォルダが作成されるのですが、
その後に、

MkDir "D:\Test\Temp\"

とすると、やはりエラーになってしまいます。

どのようにすれば、1つの処理の中で、複数階層のフォルダが作成できるのでしょうか?
ちなみにVB6.0 SP5で、実際にはMkDir関数の引数は文字列変数です。

よろしくお願いします。

A 回答 (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よりのファイル操作コマンドは、コードが正しくても時々理不尽な失敗をするので、そのせいかもしれません。
    • good
    • 0
この回答へのお礼

みなさん、ご回答ありがとうございました。

とくにサンプルソースなどは大変参考になります。

質問内容についてはいまだになぞのままなんですが・・・

お礼日時:2005/11/18 11:40

>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\"は¥不要では?
    • good
    • 0

当方の環境ではできますので、単純なエラーかも。



セミコロンだったり、\マークが抜けていたり、前後のmkdirで親ディレクトリがなかったり。フルパスでの指定ですよね?
    • good
    • 0

ちなみに自分はこんな感じで作っているのでが、


どうでしょうか?

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
    • good
    • 0

ディレクトリを複数階層新規に作成する場合は


順番に作成していけばできます。

飛び越しで2階層以上を一度に作成しようとするとエラーになります。

なので後者の方法でできるはずですが、何か勘違いはありませんか?

なお、引数は文字列変数とのことなので、
ループ内での"\"の判定が必要になります。

後日でしたら私の方でもコードを確認することはできるのですが・・・
    • good
    • 0

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
    • good
    • 1
この回答へのお礼

回答ありがとうございます。

>MkDirは、1階層下のフォルダを作成するので

そのようですね。
で、2回に分けて作成しているのですが、やはりエラーになってしまいます。

ちなみに、このPGでは作成するフォルダは必ず存在しない前提で実行されます。
(存在する場合は実行されません)

お礼日時:2005/11/15 17:52

MkDir "D:\Test"


のエラーチェックをして、なかったら
MkDir "D:\Test\Temp"

最後の\マークをはずして試してみてください。

参考URL:http://www.microsoft.com/japan/msdn/library/defa …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

説明が不足して申し訳ありません。

MkDir "D:\Test\Temp"

でも同じエラーです。

エラー内容は"パスが見つかりません"です。

お礼日時:2005/11/15 17:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています