- ベストアンサー
特定のファイル名が存在しないフォルダの検索
OS:Winodws10 64bit フォルダが数千個あり、そのなかにファイル名が「A.pdf」というファイルが存在するフォルダと 存在しないフォルダが有ります。 ファイルが存在するフォルダは普通にWindowsの検索機能で可能ですが、 ファイルが存在しないフォルダを表示させ、できればそのフォルダ名を テキスト形式などで抽出する方法はないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
その場合、フォルダの中にあるファイルを1つずつ調べる必要がありますね! そのため、たくさんのフォルダとたくさんのファイルがある場合(フォルダは十分たくさんありますが)、処理速度がどの程度になるか分かりませんが、プログラムをご希望のとおり、直しました。 ファイル名の頭が「A」で始まり、拡張子が「pdf」(「Pdf」や「PDF」など大文字を含んでいても可、しかし、ファイル名の方は、大文字の「A」限定)のファイルが発見されると、そのフォルダは抜け出すのですが・・・ 時間がかかったら、すみません。 私にはこれが限界です。 Option Explicit Dim a, b, c, d, e, t, x, y ,z Set x = CreateObject("Scripting.FileSystemObject") Set y = x.GetFolder(".") Set t = x.CreateTextFile("D:\Programming\NotFind.txt") For Each a In y.SubFolders Set z = x.GetFolder(a.Name) c = 0 For Each b In z.Files d = x.GetBaseName(b.Name) e = LCase(x.GetExtensionName(b.Name)) IF Left(d, 1) = "A" and e = "pdf" Then c = 1 Exit For End If Next Set z = Nothing If c = 0 Then t.WriteLine(a.Name) End If Next t.Close Set t = Nothing Set y = Nothing Set x = Nothing MsgBox("Finished!")
その他の回答 (2)
- Prome_Lin
- ベストアンサー率42% (201/470)
思っておられるやり方と違ったら、ごめんなさい、無視してください。 まず、以下のプログラムの説明をします。 以下のプログラムを走らせると、プログラムファイルのあるすぐ下のフォルダを1つずつ調べてゆきます。 すなわち、「D」ドライブの「ABC 」フォルダに、このプログラムファイルを放り込んで、実行すると、「D:\ABC」の下にある、すべてのフォルダ(ただし、そのフォルダの下までは調べていません、あくまでも、「ABC」直下のフォルダだけです)を1つずつ、調べます。 調べる内容は、例えば「ABC」フォルダに「XYZ」というフォルダがあった場合、その「XYZ 」フォルダ内に「A.pdf」が存在すれば、変数「c」の値を「1」にします。 存在しなければ、変数「c」の値は、「0」のままです。 存在しなかったフォルダ名を「NotFind.txt」に書き出しています。 以下のプログラムを範囲指定して、「Ctrl+c」(コントロールキーを押しながら「c」を押す)、テキストエディタかメモ帳上で、「Ctrl+v」(「c」は「コピー・記憶」なのに対して「v」は「ペースト・貼り付け」)して、「~.vbs」という名前で保存します。 例えば、「NotFind.vbs」などです。 その「NotFind.vbs」ファイルを、調べたいフォルダ群の上、上記のように、「D 」ドライブの「ABC」フォルダの下に、調べたいフォルダ群があるのでしたら、「ABC」フォルダの中に、「NotFind.vbs」を放り込んで、ダブルクリック(もしくは、シングルクリック→「Enter」の方がより確実)すると、プログラムが実行され、「NotFind.txt」というテキストファイルを「ABC」フォルダ内に作成し、プログラムの終了を示す「Finished!」という文言を画面に表示します。 もちろん、「NotFind.txt」ファイルには、存在しなかったフォルダの一覧が書き込まれています。 Option Explicit Dim a, b, c, t, x, y ,z Set x = CreateObject("Scripting.FileSystemObject") Set y = x.GetFolder(".") Set t = x.CreateTextFile("D:\Programming\NotFind.txt") For Each a In y.SubFolders Set z = x.GetFolder(a.Name) c = 0 If x.FileExists(z & "\A.pdf") Then c = 1 End If Set z = Nothing If c = 0 Then t.WriteLine(a.Name) End If Next t.Close Set t = Nothing Set y = Nothing Set x = Nothing MsgBox("Finished!")
お礼
ご回答ありがとうございます!すごい!バッチリです! ついでにもう1つ教えていただけるとたいへん助かるのですが、 ワイルドカードは使えないでしょうか?(図々しくてすいませんm(_ _)m) たまに「A.pd」fではなく「A_01.pdf」とファイル名の語尾に文字列を 追加している場合があります。 Prome_Linさんの書いていただいた「If x.FileExists(z & "\A.pdf") Then」の 部分を"A*.pdf"と変更してもアスタリスクを1つの文字と認識するようです。 どうかよろしくお願いいたします。
- t_hirai
- ベストアンサー率28% (222/788)
「ファイルリスト作成機」というソフトがあるので、使用してみてください。 これは特定のフォルダ以下の、フォルダ名や、ファイル名をCSVに出力してくれます。 出力されたCSVから、あなたの希望することができると思います。
お礼
ご回答ありがとうございます。 早速ソフトをダウンロードしてみたのですが、「出力されたCSVから、あなたの希望することができると思います。」→すいません、知識不足でどうやったらCSVからフォルダ名を絞り込めるのかが分かりませんm(_ _)m
お礼
Prome_Linさん、まさかここまで親切にしていただけるとは・・・。 Left(d,1)で文字数を変更してなかったので焦りましたが (実際のAの文字数は7文字)、バッチリ要望通りの結果でした! 感謝の念にたえません!目の前にいたら抱きつきたいです! (おっさんですが^_^;) これで抽出が簡単に行え、業務がスムーズに進みます。 本当にありがとうございましたm(_ _)m