Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4015 / 13646 ツリー ←次へ | 前へ→

【58198】再帰処理でのファイル検索 ON 08/10/10(金) 19:56 質問[未読]
【58199】Re:再帰処理でのファイル検索 マクロマン 08/10/10(金) 20:37 発言[未読]
【58202】Re:再帰処理でのファイル検索 kanabun 08/10/11(土) 11:13 発言[未読]
【58203】Re:再帰処理でのファイル検索 kanabun 08/10/11(土) 11:29 発言[未読]
【58227】Re:再帰処理でのファイル検索 熊谷隆史 08/10/12(日) 16:24 発言[未読]
【58232】Re:再帰処理でのファイル検索 ON 08/10/12(日) 23:19 お礼[未読]
【58236】Re:再帰処理でのファイル検索 ON 08/10/13(月) 9:52 質問[未読]
【58250】Re:再帰処理でのファイル検索 熊谷隆史 08/10/14(火) 15:43 発言[未読]
【58251】Re:再帰処理でのファイル検索 kanabun 08/10/14(火) 17:39 発言[未読]
【58252】Re:再帰処理でのファイル検索 neptune 08/10/14(火) 21:41 発言[未読]
【58253】Re:再帰処理でのファイル検索 kanabun 08/10/14(火) 22:15 発言[未読]
【58255】Re:再帰処理でのファイル検索 neptune 08/10/14(火) 22:48 発言[未読]
【58256】Re:再帰処理でのファイル検索 jet 08/10/14(火) 23:41 回答[未読]
【58239】Re:再帰処理でのファイル検索 kanabun 08/10/13(月) 13:55 発言[未読]
【58243】Re:再帰処理でのファイル検索 neptune 08/10/13(月) 22:25 発言[未読]
【58244】Re:再帰処理でのファイル検索 kanabun 08/10/14(火) 1:25 発言[未読]
【58261】Re:再帰処理でのファイル検索 ON 08/10/15(水) 13:25 お礼[未読]
【58263】Re:再帰処理でのファイル検索 熊谷隆史 08/10/15(水) 13:43 発言[未読]
【58271】Re:再帰処理でのファイル検索 ON 08/10/15(水) 19:40 お礼[未読]
【58333】Re:再帰処理でのファイル検索 熊谷隆史 08/10/20(月) 10:47 発言[未読]
【58871】Re:再帰処理でのファイル検索 ON 08/11/15(土) 0:23 お礼[未読]

【58198】再帰処理でのファイル検索
質問  ON  - 08/10/10(金) 19:56 -

引用なし
パスワード
   こんにちは よろしくお願いします

Application.FileSearch
でのフォルダ、ファイルの検索が遅いので

以前、高速なAPIで、フォルダ、ファイルの検索を教えて頂いた方法
(セルやイミディエイトウインドウに出力)
を、利用できないものかとチャレンジしましたがうまくいきません

やりたいことは
ファイルサーバーの所定のフォルダ配下には
重複するファイル名が存在しないことになっているのですが
時折、ファイルコピー等あったりして、キーで検索しても
複数存在したり、無かったりするものがあります

で、1ファイルだけの存在した場合場合、正常処理、そうでない場合は
メッセージを出したいと考えています


APIでの不具合の原因は、
他書への出力の場合は問題はないのですが
再帰のため戻り値や、配列に入れても最後の値しか取得できません

戻り値や配列の値が1つであれば
それを元に処理したいと考えています


APIはコピペ程度でしか利用できないレベルです
また、アプローチがおかしいような気もしています
ご教授よろしくお願い致します


下記は
配列を公開で宣言してそこに値を貯めこもうと考えました


Option Explicit
Option Compare Text


Private Type WIN32_FIND_DATAW
  dwFileAttributes As Long
  ftCreationTime(0 To 1) As Long
  ftLastAccessTime(0 To 1) As Long
  ftLastWriteTime(0 To 1) As Long
  nFileSizeHigh As Long
  nFileSizeLow As Long
  dwReserved0  As Long
  dwReserved1  As Long
  cFileName(0 To 519) As Byte
  cAlternateFileName(0 To 27) As Byte
End Type
Private Declare Function FindFirstFileW Lib "kernel32" _
    (lpFileName As Any, _
    lpFindFileData As WIN32_FIND_DATAW) As Long
Private Declare Function FindNextFileW Lib "kernel32" _
    (ByVal hFindFile As Long, _
    lpFindFileData As WIN32_FIND_DATAW) As Long
Private Declare Function FindClose Lib "kernel32" _
    (ByVal hFindFile As Long) As Long

Dim HAIRETSU() As String


' ファイルの検索 (NT系OS専用)
Sub SearchFiles3(ByVal strDir As String, strFind As String)

  Static wfd As WIN32_FIND_DATAW
  Dim strName As String
  Dim hFile As Long
  
  Dim I As Integer
  
  Dim TG_PATH As String
  
  I = 0
  TG_PATH = ""
  'GET_I = 0
  'GET_PATH = ""

  If StrComp(Right$(strDir, 1), "\", vbBinaryCompare) <> 0 Then
    strDir = strDir & "\"
  End If

  ' フォルダ(strDir)内の1件目を取得
  hFile = FindFirstFileW(ByVal StrPtr(strDir & "*"), wfd)
  If hFile = INVALID_HANDLE_VALUE Then
    ' この下の3行は消してもかまわない
    If Err.LastDllError = ERROR_CALL_NOT_IMPLEMENTED Then
      MsgBox "このOSでは動きません。", vbCritical
    End If
    Exit Sub
  End If

  Do
    ' ファイル(orフォルダ)名の取得
    strName = wfd.cFileName
    strName = Left$(strName, InStr(1, _
          strName, vbNullChar, vbBinaryCompare) - 1)

    'フォルダパス・ファイル部分一致
    If strName Like "*" & strFind & "*" Then
    '  Debug.Print strDir & strName
      TG_PATH = strDir & strName
      I = I + 1
    '  Debug.Print I
      
      ReDim HAIRETSU(I)
      HAIRETSU(I) = strDir & strName

    End If
    

    ' 属性の判定
    If wfd.dwFileAttributes And vbDirectory Then
      ' フォルダの場合
      If StrComp(strName, ".", vbBinaryCompare) <> 0 Then
       If StrComp(strName, "..", vbBinaryCompare) <> 0 Then
        ' 再帰呼び出し
        SearchFiles3 strDir & strName, strFind
        
       End If
      End If


    End If

  ' 引き続き2件目以降を取得 (全件取得するまでループ)
  Loop While FindNextFileW(hFile, wfd)

  ' ハンドルを閉じる
  FindClose hFile
  
  
  If I = 1 Then
    Debug.Print "正"
    Debug.Print TG_PATH
  
  ElseIf I > 1 Then
    Debug.Print "重複不整合"
    
  'ループ分実行されてしまう
  'Else
    'Debug.Print "無し"

  End If


End Sub


Public Sub test()


Call SearchFiles3("\\hoge", "huga")


Debug.Print HAIRETSU(1)
Debug.Print UBound(HAIRETSU)


End Sub

【58199】Re:再帰処理でのファイル検索
発言  マクロマン  - 08/10/10(金) 20:37 -

引用なし
パスワード
   直接の回答ではありません。
ここの「目安箱」にファイル一覧を取得するコードが
掲載されています。
そのコードが参考になるかもしれません。

一度覗いてみて下さい。

【58202】Re:再帰処理でのファイル検索
発言  kanabun  - 08/10/11(土) 11:13 -

引用なし
パスワード
   ▼ON さん:

>Application.FileSearch
>でのフォルダ、ファイルの検索が遅いので

それに、最新版Excel2007では、いまのところ使えないですしね(-_-)

>ファイルサーバーの所定のフォルダ配下には

以下のサンプルの
> Sub Try_FindFile()
内の
>  myPath = "D:\(Data)"
>  strFind = "abc.*"
を、
ファイルサーバーへのパスと 検索したいファイル名に置き換えて
お試しください。

P.S. 前日投稿した Sub Try_Start()の検索法は
  無駄があったので、削除しました。(もし前回投稿したものと
  スピードを比較されたいのでしたら、2つのモジュールは別Bookにて
  検証願います)
> Sub Try_FindFile()
では、2Stepで、
(1) 最初に指定フォルダのファイルを検索し、
(2) つぎに、サブフォルダの検索を行い、各SubFolder内を再帰呼び出しし、
   同名のファイルを検索しています。

'-------------------------------------
Option Explicit

Private Const MAX_PATH = 260
Private Const INVALID_HANDLE_VALUE = (-1)

' WIN32_FIND_DATA構造体
Private Type WIN32_FIND_DATA
  dwFileAttributes  As Long
  ftCreationTime   As Currency
  ftLastAccessTime  As Currency
  ftLastWriteTime   As Currency
  nFileSizeHigh    As Long
  nFileSizeLow    As Long
  dwReserved0     As Long
  dwReserved1     As Long
  cFileName(1 To MAX_PATH * 2) As Byte 'Unicode
  cAlternate(1 To 14 * 2) As Byte    'Unicode
End Type


Private Declare Function FindFirstFile _
       Lib "kernel32" Alias "FindFirstFileW" _
        (ByVal lpFileName As Long, _
        lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile _
       Lib "kernel32" Alias "FindNextFileW" _
         (ByVal hFindFile As Long, _
         lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose _
       Lib "kernel32" _
         (ByVal hFindFile As Long) As Long

' ファイルの属性
Private Const fATTR_READONLY  As Long = &H1
Private Const fATTR_HIDDEN   As Long = &H2
Private Const fATTR_SYSTEM   As Long = &H4
Private Const fATTR_DIRECTORY As Long = &H10
Private Const fATTR_ARCHIVE  As Long = &H20
Private Const fATTR_NORMAL   As Long = &H80

'-------------------------------------------------------------

Sub Try_FindFile()
  Dim myPath As String
  Dim strFind As String
  Dim f As String
  Dim n&
  Dim myList() As String

  myPath = "D:\(Data)"
  strFind = "abc.*"
  FindFile myPath, strFind, myList(), n '★呼び出し
  
  If n Then
    MsgBox Join(myList, vbCr), , strFind & " ---> " & n & " Files"
  Else
    MsgBox "該当ファイルなし"
  End If
  
End Sub


Private Sub FindFile(Pathname$, strFind$, myList$(), _
           fCount&, Optional SearchChild As Boolean = True)
 Dim p As String
 Dim fDATA As WIN32_FIND_DATA
 Dim lngAttribute As Long
 Dim f As String
 Dim hFile As Long
 Dim SubDirs() As String, nSub As Long, i As Long

 If Right$(Pathname, 1) <> "\" Then Pathname = Pathname & "\"
 strFind = LCase$(strFind)
 
 'まず 指定パス 直下の ファイルstrFindの検索をおこなう
  lngAttribute = fATTR_NORMAL Or _
          fATTR_READONLY Or _
          fATTR_SYSTEM Or _
          fATTR_HIDDEN Or _
          fATTR_ARCHIVE
  fDATA.dwFileAttributes = lngAttribute
 
 p = Pathname & strFind
 hFile = FindFirstFile(StrPtr(p), fDATA)
 If hFile = INVALID_HANDLE_VALUE Then Exit Sub
 Do
   f = fDATA.cFileName
   f = Left$(f, InStr(f, vbNullChar) - 1)
   If (fDATA.dwFileAttributes And vbDirectory) = 0 Then 
     fCount = fCount + 1
     ReDim Preserve myList(1 To fCount)
     myList(fCount) = Pathname & f
   End If
 Loop While FindNextFile(hFile, fDATA)
 FindClose hFile
 
 'つぎに 指定パス 内のサブフォルダの検索をおこなう
 If SearchChild Then
   p = Pathname & "*.*"
   fDATA.dwFileAttributes = fATTR_DIRECTORY
   hFile = FindFirstFile(StrPtr(p), fDATA)
   If hFile = INVALID_HANDLE_VALUE Then Exit Sub
   Do
     f = fDATA.cFileName
     f = Left$(f, InStr(f, vbNullChar) - 1)
     If (fDATA.dwFileAttributes And vbDirectory) Then
       If Left$(f, 1) <> "." Then
         nSub = nSub + 1
         ReDim Preserve SubDirs(1 To nSub)
         SubDirs(nSub) = Pathname & f
       End If
     End If
   Loop While FindNextFile(hFile, fDATA)
   FindClose hFile
 
   If nSub Then
     For i = 1 To nSub
       FindFile SubDirs(i), strFind, myList(), fCount
     Next
   End If
 End If

End Sub

【58203】Re:再帰処理でのファイル検索
発言  kanabun  - 08/10/11(土) 11:29 -

引用なし
パスワード
   ▼ON さん:
ごめんなさい。まだ、テストが足りなかった。。。

>Private Sub FindFile(Pathname$, strFind$, myList$(), _
>           fCount&, Optional SearchChild As Boolean = True)

内の
> If hFile = INVALID_HANDLE_VALUE Then Exit Sub
> Do
>   f = fDATA.cFileName
>   f = Left$(f, InStr(f, vbNullChar) - 1)
>   If (fDATA.dwFileAttributes And vbDirectory) = 0 Then 
>     fCount = fCount + 1
>     ReDim Preserve myList(1 To fCount)
>     myList(fCount) = Pathname & f
>   End If
> Loop While FindNextFile(hFile, fDATA)
> FindClose hFile

ここを、

 If hFile <> INVALID_HANDLE_VALUE Then
   Do
     f = fDATA.cFileName
     f = Left$(f, InStr(f, vbNullChar) - 1)
     If (fDATA.dwFileAttributes And vbDirectory) = 0 Then
       fCount = fCount + 1
       ReDim Preserve myList(1 To fCount)
       myList(fCount) = Pathname & f
     End If
   Loop While FindNextFile(hFile, fDATA)
   FindClose hFile
 End If

としないと、トップフォルダ内に 指定のファイルがないと、
サブフォルダを検索しませんでした。。
なんどもすみません m(__)m

【58227】Re:再帰処理でのファイル検索
発言  熊谷隆史  - 08/10/12(日) 16:24 -

引用なし
パスワード
   ▼ON さん:
Mougでの当時の質問者さんなのでしょうか。
http://web.archive.org/web/20031023095333/http://www2.moug.net/app/bbs/message.php?cat=acm_v&id=2003060947+++++
どなたのコードを参考にしているのか、
書くべきでないのでしょうか。
# 何かタイミングが良すぎると言うか、複雑な心境。

【58232】Re:再帰処理でのファイル検索
お礼  ON  - 08/10/12(日) 23:19 -

引用なし
パスワード
   遅くなりました

▼マクロマン さん こんばんは

リンク先のご紹介ありがとうございます

Jaka さんの【62】フォルダの選択
ちゃっぴ さんの【74】FilePathを列挙するサンプル
参考にさせて頂きました

最近になってこちらの掲示板にお邪魔するようになったもので
目安箱知りませんでした
いろいろなTIPが沢山あって疑問に思っていた事項ばかりで 
へー てな感じで、色々勉強させて頂いています

ありがとうございました


▼kanabun さん こんばんは
コードのご提示ありがとうございます

最初のコードで希望の操作かないました。

当初、
他のSubからの呼び出しにも挑戦してみたのですが
うまく出来なかったような・・・
どんなコードを書いたか思い出せず、いまいち釈然としない状況です

その後、高速化のコードのアップを頂いて
自宅のPCで試してみたのですが1件も引っ掛からず ??
で、APIでの再帰がいまいち理解しきれていないため
マクロマンさんご紹介のページ等で理解しようと思っていましたが
悪い癖で、他のTIPにも興味出て・・・

そのうち、修正コードを頂いたので
試してみたのですが、初回は別にしても
次回以降は
当初コード
 532ミリ秒
 610ミリ秒
高速化コード
 985ミリ秒
 984ミリ秒
となり、
>(1) 最初に指定フォルダのファイルを検索し、
>(2) つぎに、サブフォルダの検索を行い、各SubFolder内を再帰呼び出しし、
>   同名のファイルを検索しています。
でやはり、この原因?、APIの再帰を理解しなくてはいけないと・・・
そんな中で、下記に続きます


▼熊谷隆史 さん こんばんは

リンク先のご紹介ありがとうございます
kanabunさんのQなんですね
APIのコードが沢山あってとても参考になり理解度の低さが身にしみました
その上、リンク先も濃いものばかりで
マクロマンさんからのご紹介からこれでは、頭にインプットどころか
思考停止から脳死みたいな・・・・

>どなたのコードを参考にしているのか、
>書くべきでないのでしょうか。
># 何かタイミングが良すぎると言うか、複雑な心境。

リンク先を見て!!
指定フォルダのファイル一覧取得含むサブフォルダ
http://web.archive.org/web/20031023095333/http://www2.moug.net/app/bbs/message.php?cat=acm_v&id=2003060947+++++
は、私のQでした

・・・( = =) トオイメ
当時、shiraさんから、初めてAPIを直々にご教授頂いて、
その凄さに感激したことが思い出されました
その一方、進歩の遅さにも感激 (^_^;;;
その上、熊谷さんがそのURLをご存知だったとは (~_~;)・・・・


私事ですが
突然、胸の痛みに襲われ8月の末から一月ばかり入院していました
その時には、本当に死ぬのかと思ったぐらいでしたがいまは全快

で、mougの最後の投稿
mougにログインできません
http://www.moug.net/faq/viewtopic.php?t=31446&highlight=
を見てみると
熊谷隆史さんからの書き込みが・・・
お礼の書き込みせずに申し訳ありませんでした

yoka→ウーロン→ON 等 色々な名前で出ています (*o*)\baki

脱線しますが、あちらで

>会社でのご利用の場合、社内セキュリティシステムなどで
>Cookie情報が取得できないなどの制限をかけていらっしゃるケースが
>あるようです。
>もし可能ならば、会社内の別のPCでログインをお試しいただくことは
>可能でしょうか?会社内の別のPCからもログインができないならば
>社内のセキュリティシステムでのご利用が制限されていらっしゃる可能性が高いです

>社内でわざわざ制限かけているということはこういうシステムに対して制限を意図的
>にかけているのだからできたら逆にまずいでしょ。
>システム管理者としては泣いてしまいますよ(せっかく金かけて対応しているのに)

とかの回答を頂いていますが

webの仕組みはよく知りませんが
会社からでも、VBA質問箱は、アクセスできるし、
こちらは、新規投稿すれば、自動的に投稿者欄に名前他が入力済み
ということは、キャッシュへの書き込みをしているわけですよね

また、
>私も会社からはログインできません。
>セキュリティ設定の問題だろうと思い どうしても必要だったら情報システム部に
>質問してみようかと思っています。基本的に会社から掲示板への投稿は禁止なので
>今の所 質問する予定もありませんが。
うちもそうですが、管理部署が変にうるさいので申請を出す気になれないし
自宅に帰ってから投稿する気には面倒でなれない
(出せば通るはずですが・・・)

ので、
VBAを教えて頂いた場所だったのですが
せっかく会員登録しましたが、足が遠のきがちになってしまいました

皆様、QAにふさわしくない書き込みとなってしまいましたが
今後もよろしくお願いいたします


>そのうち、修正コードを頂いたので
>試してみたのですが、初回は別にしても
は、時間がかかると思いますが、勉強してみたいと思います

【58236】Re:再帰処理でのファイル検索
質問  ON  - 08/10/13(月) 9:52 -

引用なし
パスワード
   補足修正訂正わかんなーい?URLが変です


>▼熊谷隆史 さん こんばんは

>リンク先のご紹介ありがとうございます
>kanabunさんのQなんですね
についてですが

最初に普通にURLにリンク先を入れて開くと

  1.
   Q&A|Excel (VBA)|CreateFile が失敗するとき
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    - これまでに閲覧した検索結果は3 件 - 7:24
   2008年9月20日 ... cFileName(1 To MAX_PATH * 2) As Byte > cAlternate(1 To 14 * 2) As Byte > End Type ↑でいいのでしょうか。 http://web.archive.org/web/20031023095333/http:// www2.moug.net/app/bbs/message.php?cat=acm_v&id=2003060947+++++ ...
   www.moug.net/faq/viewtopic.php?t=32692 - 88k - キャッシュ - 関連ページ - メモをとる

だったと思います

投稿後、ためしにURLにリンク先を入れて開いてみると

http://web.archive.org/web/20031023095333/http://www2.moug.net/app/bbs/message.php?cat=acm_v&id=2003060947+++++
指定フォルダのファイル一覧取得含むサブフォルダ
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
が直接ひらいてしました


昨夜あれから、なんどか試してみてたのですが、いくらやっても、上記のままです


今朝も、色々試してみたのですが
Internet Archive
tp://www.archive.org/index.php
のurl欄に
tp://www2.moug.net/app/bbs/message.php?cat=acm_v&id=2003060947
として
Search Results for Jan 01, 1996 - Apr 15, 2008
2003
1 pages
Oct 30, 2003 *
から開くと
http://web.archive.org/web/20031030170450/http://www2.moug.net/app/bbs/message.php?cat=acm_v&id=2003060947
指定フォルダのファイル一覧取得含むサブフォルダ
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
となったり見つからなかったり

>どなたのコードを参考にしているのか、
の文面からは

Internet Archive経由でなく、直URLが下記となる
tp://www.moug.net/faq/viewtopic.php?t=32692
CreateFile が失敗するとき
^^^^^^^^^^^^^^^^^^^^^^^^^^
とのことだと思っています

皆さんのPCでは、どんな風に開けているか不明ですが・・・
今、再度試してみましたが、同じ状況となっています

こんなことは初めてで
書いている本人頭がこんがらがっているので
わかりにくいと思いますが、何かありましたらよろしくお願いいたします

ちなみに、ウインドウが沢山開いて居る状態で、再起動すると
わからなくなってしまいそうで、昨夜から再起動していません
もしかしたら、キャッシュのせいかも知れませんが・・・・・

【58239】Re:再帰処理でのファイル検索
発言  kanabun  - 08/10/13(月) 13:55 -

引用なし
パスワード
   ▼ON さん:

>最初のコードで希望の操作かないました。

>そのうち、修正コードを頂いたので
>試してみたのですが、初回は別にしても
>次回以降は
>当初コード
> 532ミリ秒
> 610ミリ秒
>高速化コード
> 985ミリ秒
> 984ミリ秒
>となり、

いやー、申し訳ない。完全にぼくの <早とちり> でした。

> fDATA.dwFileAttributes = fATTR_DIRECTORY

で、DIRECTORY属性だけ与えておけば、フォルダだけ列挙できるかと早合点
してました。
実際は、こうしても、すべてのファイルがヒットしてしまうんですね Orz

Office TANAKA - Excel VBA(Dir関数でサブフォルダを取得する)
h t t p://officetanaka.net/excel/vba/tips/tips95.htm
にもあるように、

Dir関数の 第二引数ファイル属性は

定数     値  内容
vbNormal  0   標準ファイル
vbReadOnly 1   読み取り専用ファイル
vbHidden  2   隠しファイル
vbSystem  4   システムファイル(Macintoshでは使用できません)
vbVolume  8   ボリュームラベル(Macintoshでは使用できません)
vbDirectory 16  フォルダ
vbAlias   64  エイリアスファイル(Macintoshでのみ使用できます)

と、定数「標準ファイル」の値が 0 なので、フォルダだけの検索ができない。
しかし、

FildFirstFileのFILE_ATTRIBUTEは、

Const FILE_ATTRIBUTE_ARCHIVE = &H20
Const FILE_ATTRIBUTE_DIRECTORY = &H10
Const FILE_ATTRIBUTE_HIDDEN = &H2
Const FILE_ATTRIBUTE_NORMAL = &H80
Const FILE_ATTRIBUTE_READONLY = &H1
Const FILE_ATTRIBUTE_SYSTEM = &H4
Const FILE_ATTRIBUTE_TEMPORARY = &H100

とあるように、Normalが &h80 で 0 でないので、
> FILE_ATTRIBUTE_DIRECTORY = &H10
だけを指定すれば、フォルダだけ検索できるかと思いこんでいました。

同じようなAPI関数に、
FindFirstFileEx というのがあるので、ひょっとしたら、これだと
属性でフィルタかけて検索できるのかな? と思ったりしたのですが、
これについての説明が Web にはあまり転がっていないようで、
トライできてません。

どなたか、
「サブフォルダだけの検索」ができるAPIをご存じありませんか?

いずれにしても、「高速版」は 2重に検索してるから、
最初のバージョンよりずっと「低速」です。
ごめんなさい。

【58243】Re:再帰処理でのファイル検索
発言  neptune  - 08/10/13(月) 22:25 -

引用なし
パスワード
   ▼kanabun さん:
ちょっとだけお邪魔します。

宣言部分だけ何とかなりそうなので一応書いておきます。
既に、作成しておられるならこの書き込みは必要ありませんので
無視して結構です。

>これについての説明が Web にはあまり転がっていないようで、
>トライできてません。
という事なので、探してみましたが本当にあまり無いですね。
で、ヘッダーファイルから拾いました。

Public Enum FINDEX_INFO_LEVELS
  FindExInfoStandard
  FindExInfoMaxInfoLevel
End Enum
Public Enum FINDEX_SEARCH_OPS
  FindExSearchNameMatch
  FindExSearchLimitToDirectories
  FindExSearchLimitToDevices
  FindExSearchMaxSearchOp
End Enum

'多分lpSearchFilterは0で良いと思います。
'FindExInfoStandard を使用する場合第3引数はWIN32_FIND_DATAを
'返しますのでそのようにしてます。
Public Declare Function FindFirstFileEx Lib "kernel32.lib" _
        (ByVal lpFileName As String, _
        ByVal fInfoLevelId As FINDEX_INFO_LEVELS, _
        ByRef lpFindFileData As WIN32_FIND_DATA, _
        ByVal fSearchOp As FINDEX_SEARCH_OPS, _
        ByVal lpSearchFilter As Long, _
        ByVal dwAdditionalFlags As Long) As Long

あとはMSDN「FindFirstFileEx 関数」
ht tp://msdn.microsoft.com/ja-jp/library/cc429235.aspx
があれば何とかなりそうです。
見た感じFindFirstFileの代わりにFindFirstFileEx 使うだけで良いのですかね?

テストしてないので念の為、winbase.h内の定義をUPしときます。
'typedef enum _FINDEX_INFO_LEVELS {
'  FindExInfoStandard,
'  FindExInfoMaxInfoLevel
'} FINDEX_INFO_LEVELS;
'
'typedef enum _FINDEX_SEARCH_OPS {
'  FindExSearchNameMatch,
'  FindExSearchLimitToDirectories,
'  FindExSearchLimitToDevices,
'  FindExSearchMaxSearchOp
'} FINDEX_SEARCH_OPS;
'
'#define FIND_FIRST_EX_CASE_SENSITIVE  0x00000001
'
'WINBASEAPI
'__out
'Handle
'WINAPI
'FindFirstFileExA(
'  __in    LPCSTR lpFileName,
'  __in    FINDEX_INFO_LEVELS fInfoLevelId,
'  __out   LPVOID lpFindFileData,
'  __in    FINDEX_SEARCH_OPS fSearchOp,
'  __reserved LPVOID lpSearchFilter,
'  __in    DWORD dwAdditionalFlags
'  );
'
ここで根性尽きました。よろしければトライしてみて下さい。^ ^;;

>「サブフォルダだけの検索」ができるAPIをご存じありませんか?
ですが、MSDNをさまよってみましたが、findfirstfileexが一番可能性
ありそうな気はします?

【58244】Re:再帰処理でのファイル検索
発言  kanabun  - 08/10/14(火) 1:25 -

引用なし
パスワード
   ▼neptune さん、ありがとうございます。
> ▼kanabun さん:
> ちょっとだけお邪魔します。
>
> 宣言部分だけ何とかなりそうなので一応書いておきます。

> ヘッダーファイルから拾いました。
>
> Public Enum FINDEX_INFO_LEVELS
>   FindExInfoStandard
>   FindExInfoMaxInfoLevel
> End Enum
> Public Enum FINDEX_SEARCH_OPS
>   FindExSearchNameMatch
>   FindExSearchLimitToDirectories
>   FindExSearchLimitToDevices
>   FindExSearchMaxSearchOp
> End Enum
>
> '多分lpSearchFilterは0で良いと思います。

> Public Enum FINDEX_SEARCH_OPS

>   FindExSearchLimitToDirectories
が、文字通りに解釈すると、「Directoryだけに制限する」と
読めるので、早速、これを取り入れてみました。

'-------------------------------------
Option Explicit

Private Const MAX_PATH = 260
Private Const INVALID_HANDLE_VALUE = (-1)

' WIN32_FIND_DATA構造体
Private Type WIN32_FIND_DATA
  dwFileAttributes  As Long
  ftCreationTime   As Currency
  ftLastAccessTime  As Currency
  ftLastWriteTime   As Currency
  nFileSizeHigh    As Long
  nFileSizeLow    As Long
  dwReserved0     As Long
  dwReserved1     As Long
  cFileName(1 To MAX_PATH * 2) As Byte 'Unicode
  cAlternate(1 To 14 * 2) As Byte    'Unicode
End Type

Private Declare Function FindFirstFile _
       Lib "kernel32" Alias "FindFirstFileW" _
        (ByVal lpFileName As Long, _
        lpFindFileData As WIN32_FIND_DATA) As Long

Public Enum FINDEX_INFO_LEVELS
  FindExInfoStandard
  FindExInfoMaxInfoLevel
End Enum
Public Enum FINDEX_SEARCH_OPS
  FindExSearchNameMatch
  FindExSearchLimitToDirectories
  FindExSearchLimitToDevices
  FindExSearchMaxSearchOp
End Enum

Declare Function FindFirstFileEx& _
      Lib "kernel32" Alias "FindFirstFileExW" _
       (ByVal lpFileName&, _
        ByVal InfoLevelIdReserved&, _
        lpFindFileData As WIN32_FIND_DATA, _
        ByVal SearchOp&, _
        ByVal lpSearchFilterReserved&, _
        ByVal dwAdditionalFlagsReserved&)

' LPCTSTR lpFileName,       // 検索するファイル名
' FINDEX_INFO_LEVELS fInfoLevelId, // データの情報レベル
' LPVOID lpFindFileData,      // 返された情報へのポインタ
' FINDEX_SEARCH_OPS fSearchOp,   // 実行するフィルタ処理のタイプ
' LPVOID lpSearchFilter,      // 検索条件へのポインタ
' DWORD dwAdditionalFlags     // 補足的な検索制御フラグ

Private Declare Function FindNextFile _
       Lib "kernel32" Alias "FindNextFileW" _
         (ByVal hFindFile As Long, _
         lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose _
       Lib "kernel32" _
         (ByVal hFindFile As Long) As Long
'-------------------------------------------------------------

Sub Try_FindFileEx()
  Dim myPath As String
  Dim strFind As String
  Dim f As String
  Dim n&
  Dim myList() As String
  Dim t!
  
  t = Timer()
  myPath = "D:\(Data)"
  strFind = "abc.*"
    FindFileEx myPath, strFind, myList(), n '★呼び出し
  
  Debug.Print "'★Try_FindFileEx"; Timer() - t
  If n Then
    MsgBox Join(myList, vbCr), _
      , strFind & " ---> " & n & " Files"
  Else
    MsgBox "該当ファイルなし"
  End If
End Sub

Private Sub FindFileEx(Pathname$, strFind$, myList$(), _
      fCount&, Optional SearchChild As Boolean = True)
 Dim p As String
 Dim fDATA As WIN32_FIND_DATA
 Dim lngAttribute As Long
 Dim f As String
 Dim hFile As Long
 Dim SubDirs() As String, nSub As Long, i As Long

 If Right$(Pathname, 1) <> "\" Then Pathname = Pathname & "\"
 
 '指定フォルダ内の指定ファイルの検索
 p = Pathname & strFind
 hFile = FindFirstFile(StrPtr(p), fDATA)
 If hFile <> INVALID_HANDLE_VALUE Then
   Do
     f = fDATA.cFileName
     f = Left$(f, InStr(f, vbNullChar) - 1)
     If (fDATA.dwFileAttributes And vbDirectory) = 0 Then
       fCount = fCount + 1
       ReDim Preserve myList(1 To fCount)
       myList(fCount) = Pathname & f
     End If
   Loop While FindNextFile(hFile, fDATA)
   FindClose hFile
 End If
 
 'つぎに 指定パス 内のサブフォルダの検索をおこなう
 If SearchChild Then
   p = Pathname & "*"
   hFile = FindFirstFileEx(StrPtr(p), _
               0&, _
               fDATA, _
               FindExSearchLimitToDirectories, _
               0&, _
               0&)
   If hFile = INVALID_HANDLE_VALUE Then Exit Sub
   Do
     f = fDATA.cFileName
     f = Left$(f, InStr(f, vbNullChar) - 1)
     If (fDATA.dwFileAttributes And vbDirectory) Then
       If Not f Like ".*" Then
         nSub = nSub + 1
         ReDim Preserve SubDirs(1 To nSub)
         SubDirs(nSub) = Pathname & f
       End If
     End If
   Loop While FindNextFile(hFile, fDATA)
   FindClose hFile
 
   If nSub Then
     For i = 1 To nSub
       'サブフォルダ内の指定ファイルの検索
       FindFileEx SubDirs(i), strFind, myList(), fCount
     Next
   End If
 End If

End Sub

'----------------------
しかし、FindExSearchLimitToDirectories を指定しているにも
かかわらず、残念ながら、これでもファイルが検索されてしまい
ました。。。
> ですが、MSDNをさまよってみましたが、findfirstfileexが一番
> 可能性ありそうな気はします?
いいところまで来たのか、無駄な努力をしているのか?
その辺が知りたいです。。

あと、マクロマンさんご紹介の「目安箱」のなかに、
ちゃっぴさんのサブフォルダを含むファイルの一覧の
各種サンプルがありますが、FindFile系API以外では、
>  【その2 コマンドプロンプトDIRコマンド Version】
>'【要参照】「Windows Scripting Host Object Model」

が、有効なことを再認識しました。(^^
<引用>
>ファイルの入出力を介しますが、FSOよりも動作が速いのが魅力です。
>また、サブフォルダの検索のOn/Offをオプション"/S"だけで
>切り替えられるのも魅力です。
>
>ただ、残念なことにOSに依存します。 </引用>

(↓kanabun が変数名など勝手に変えちゃってます)
Sub RunDir() 
  Dim oWShell   As WshShell
  Dim objRedirectFile As File
  Dim objRedirectTXT As TextStream
  Dim strPathFilename  As String    '対象フォルダパス
  Dim strRedirectPath As String     '一時ファイルパス
  Dim ko    As Long
  Dim varFileList   As Variant
  Dim t!
  
  t = Timer
  Set oWShell = New WshShell
 
  strPathFilename = "D:\(Data)\abc.*"
  strRedirectPath = "D:\(Data)\Temp\DirTemp.txt"
  
  ko = oWShell.Run("CMD /C DIR """ & strPathFilename _
    & """ /A-D /B /S > """ & strRedirectPath & """", 7, True)
  Set oWShell = Nothing

  If ko = 0 Then
    Dim io As Integer
    Dim ss As String
    
    io = FreeFile()
    Open strRedirectPath For Binary As io
    ReDim buf(1 To LOF(io)) As Byte
    Get #io, , buf
    Close io
    ss = StrConv(buf, vbUnicode)
  End If
  t = Timer - t
  MsgBox ss,,t
End Sub

あるフォルダ内の "abc*.xls" というファイルを
サブフォルダも含めて
通常のDirの再帰で検索すると、 7.2秒、
Sub RunDir() で検索すると、  2.4〜2.7秒、
このスレッドで最初に提示して(削除してしまった)
★Try_FindFileO で検索すると、 1.72秒
といった感じです。
★Try_FindFileO は、よく見るアルゴリズム
( FindFirstFile で フォルダ内のすべてのファイルを検索し、
  その中から、指定したパターンと一致するファイルを取り出し、
  同時に、属性がDirectoryであれば 自身を再帰呼び出しする )
なので、Dirの再帰と同じアルゴリズムなのです。
Dir関数 も FindFirstFile関数も ワイルドカードを使った
特定のファイルの検索ができるのに、サブフォルダの検索も
やろうとなると、とたんに FileSystemObject同様、すべての
ファイルを取得しなければならない。そこが効率悪いと思うのに
(1) 指定ファイル("abc*.xls")の検索
(2) サブフォルダの検索
をしているサンプルが、いまのところ、どこにもないということは
FindFirstFileExでも、(2)ができないんでしょうかね?

(1)はFindFirstFileで、
(2)の部分だけ Fso.GetFolder(Pathname).SubFolders
で実験してみた結果は、 7.0 秒でした。

【58250】Re:再帰処理でのファイル検索
発言  熊谷隆史  - 08/10/14(火) 15:43 -

引用なし
パスワード
     ▼ON さん:
こんにちは。
> 突然、胸の痛みに襲われ8月の末から一月ばかり入院していました
お大事にどうぞ。

> 熊谷隆史さんからの書き込みが・・・
単なる報告ですので、見て頂けたなら結構です。

> リンク先のご紹介ありがとうございます
> kanabunさんのQなんですね

要するにお使いのブックに残されてた古いコードを
今回、加工して、ご質問されたと言うことですね。

で、ブラウザのアドレス欄にURLをコピペしたら、
Google検索されたり、
Internet Archiveのログが直に開いたり、
場合によって異なる挙動を示すと。

で上記サイトの検索結果が不定であると。

上のはInternet Archiveの混み具合で
検索結果が変わることはまあ、考えられることです。

> そのURLをご存知だったとは (~_~;)・・・・
モーグだけに相当、潜って見つけました。

今のMougは、書き込みが減少傾向にあるようで
回答者さんも質問者さんも離れているので、
私もたまに見に来る程度です。

他言語の勉強で忙しいのと、
VBA自体、ほとんど使わなくなってるのもありますが。


> >   FindExSearchLimitToDirectories
> が、文字通りに解釈すると、「Directoryだけに制限する」と
> 読めるので、早速、これを取り入れてみました。


kanabunさん
http://msdn.microsoft.com/en-us/library/aa364416.aspx
http://msdn.microsoft.com/en-us/library/ms889664.aspx
Windows CEなら有効なのかも知れません。

【58251】Re:再帰処理でのファイル検索
発言  kanabun  - 08/10/14(火) 17:39 -

引用なし
パスワード
   ▼熊谷隆史 さん:

>kanabunさん
>http://msdn.microsoft.com/en-us/library/aa364416.aspx
>http://msdn.microsoft.com/en-us/library/ms889664.aspx
>Windows CEなら有効なのかも知れません。

情報ありがとうございます。
何となくですが、ダメっぽいですね。

できたんなら、熊谷さんご紹介のURLの FindFirstFileサンプルで
shiraさん使っておられたことでしょう (--;)

それにしても、
ht tp://web.archive.org/web/20031023095333/ht tp://www2.moug.net/app/bbs/message.php?cat=acm_v&id=2003060947+++++
は、
指定フォルダ内の「指定ファイル」を「サブフォルダも含めて」検索する方法
が、まとまって書かれていて、ぼくも教科書にしています(^^

【58252】Re:再帰処理でのファイル検索
発言  neptune  - 08/10/14(火) 21:41 -

引用なし
パスワード
   皆さん、こんにちは。

>>Windows CEなら有効なのかも知れません。
>
>情報ありがとうございます。
>何となくですが、ダメっぽいですね。
久しぶりに脳味噌を使って見ました。
一応取れるようですけど、どうなんですかね?
下記のコードではディレクトリのみが取れるようです。
熊谷隆史 さんのリンク先を見ると、なぜかはわかりませんけど。

>>Windows CEなら有効なのかも知れません。
とリンク先をみて萎えてしまいました。^ ^;;

XP SP3 VB6で作成
Private Sub Command1_Click()
  Dim cnt As Long
  Dim sBuf As String
  
  Call EnumSubDir(cnt, "C:\hogehoge\*")
End Sub

'標準モジュール
'宣言省略
'渡された直下のフォルダを列挙する
Public Sub EnumSubDir(ByRef cnt As Long, ByVal dirname As String)
Dim fd As WIN32_FIND_DATA
Dim h As Long
Dim sBuf As String
Dim lRet As Long

  'ハンドル取得
  h = FindFirstFileEx(dirname, FINDEX_INFO_LEVELS.FindExInfoStandard, _
          fd, FINDEX_SEARCH_OPS.FindExSearchLimitToDirectories, vbNull, 0&)
          
  If INVALID_HANDLE_VALUE = h Then
    Exit Sub
  End If
  
  Do
    sBuf = EditBuf(fd.cFileName)
    If fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY Then
      ' ディレクトリの場合
      If (sBuf <> ".") And (sBuf <> "..") Then
        ' .と..は処理しない
        Debug.Print "ディレクトリ - " & sBuf
      End If
    Else  ' ディレクトリ以外の場合(ファイル)
      Debug.Print "ファイル - " & sBuf
    End If
  '次のファイルを検索する
    lRet = FindNextFile(h, fd)
  Loop Until lRet <= 0

  'ハンドルを閉じる
  Call FindClose(h)

End Sub

Public Function EditBuf(Buf As String) As String
  Dim i As Long

  i = InStr(Buf, vbNullChar)
  If i <> 0 Then
    EditBuf = Left$(Buf, i - 1)
  Else
    EditBuf = Buf
  End If
End Function

私も最近はC#かVB2008です。どうも万年初心者になりそうですけど。
でもframework必須というのが嫌といえば嫌ですね。

【58253】Re:再帰処理でのファイル検索
発言  kanabun  - 08/10/14(火) 22:15 -

引用なし
パスワード
   ▼neptune さん:

>>何となくですが、ダメっぽいですね。
>久しぶりに脳味噌を使って見ました。
>一応取れるようですけど、どうなんですかね?
>下記のコードではディレクトリのみが取れるようです。

ここは、
>    If fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY Then

    If fd.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY Then

こうじゃないですか?

【58255】Re:再帰処理でのファイル検索
発言  neptune  - 08/10/14(火) 22:48 -

引用なし
パスワード
   ▼kanabun さん:
ありゃ
>ここは、
>>    If fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY Then
>
>    If fd.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY Then
>
>こうじゃないですか?
そうですね。

それに
>Public Sub EnumSubDir(ByRef cnt As Long, ByVal dirname As String)
Public Sub EnumSubDir(ByVal dirname As String)
で、
Private Sub Command1_Click()
  Dim cnt As Long
  Dim sBuf As String
  
  Call EnumSubDir("C:\hogehoge\*")
End Sub
ですね。

元ねたが、Cのサンプルだったんですが、原型がかなり薄くなるくらい
になったので、変更忘れたみたいです。

今検証してみましたが、やっぱり駄目ですね。
はっきりしてよかったです。

【58256】Re:再帰処理でのファイル検索
回答  jet  - 08/10/14(火) 23:41 -

引用なし
パスワード
   ExでFindExSearchLimitToDirectoriesをという事だと思いますがmsdnに

FindExSearchLimitToDirectories
  Reserved for future use.

とありますからこれが既に古い情報でなければ無理だと思います。

【58261】Re:再帰処理でのファイル検索
お礼  ON  - 08/10/15(水) 13:25 -

引用なし
パスワード
   遅くなりました
皆様、
色々な情報、検証ありがとうございます


APIについては、
他含めて、とりあえずメモさせて頂き
CreateFile が失敗するとき
://www.moug.net/faq/viewtopic.php?t=32692
等あわせて、勉強させて頂きます

後日、APIでのQあった時にアドバイス頂けると嬉しいです
よろしくお願い致します


▼熊谷隆史 さん:
>単なる報告ですので、見て頂けたなら結構です。
お知らせ頂き嬉しいです
ありがとうございました

URLの件 コメントありがとうございます

>今のMougは、書き込みが減少傾向にあるようで
>回答者さんも質問者さんも離れているので、
>私もたまに見に来る程度です。
そんな気がしていました
私の場合は、書き込みできないのでやむを得ずでしたが
やはり、寂しい〜 です


今回の処理とあわせて
気になっている方もいらっしゃるかもしれないので
>このスレッドで最初に提示して(削除してしまった)を
kanabunさん 勝手で申し訳ないですが、再掲示させて頂きます


今回処理

Public Sub get_job(myPath As String, strFind As String)
  'Dim myPath As String
  'Dim strFind As String
  Dim f As String
  Dim n&
  Dim myList() As String
  
  Dim cnt
 
  'myPath = "D:\(Data)"
  'strFind = "abc.*"
  FindFile myPath, strFind, myList(), n '★呼び出し
  
  If n = 0 Then
  
    'Debug.Print "無し"
  
  ElseIf n = 1 Then
  
    'Debug.Print n & " 件"
    'Debug.Print Join(myList, vbCr)
    '実際の処理 ブックを開く等
  
  Else
  
    'Debug.Print n & " 件"
    'Debug.Print Join(myList, vbCr)
    'Debug.Print "重複"
  
  End If

End Sub


このスレッドで最初に提示して(削除してしまった)の書き込み

【58200】Re:再帰処理でのファイル検索

発言[NEW] kanabun - 08/10/10(金) 21:09 -

引用なし
パスワード
  ▼ON さん:

>Application.FileSearch
>でのフォルダ、ファイルの検索が遅いので

それに、最新版Excel2007では、いまのところ使えないですしね(-_-)

>ファイルサーバーの所定のフォルダ配下には

以下のサンプルの
> Sub Try_Start()
内の
>  myPath = "D:\(Data)"
>  strFind = "abc.*"
を、ファイルサーバーへのパスと 検索したいファイル名に置き換えて
お試しください。

'---------------------------------------------
Option Explicit

Private Const MAX_PATH = 260
Private Const INVALID_HANDLE_VALUE = (-1)

' WIN32_FIND_DATA構造体 (Unicodeバージョン)
Private Type WIN32_FIND_DATA
  dwFileAttributes  As Long
  ftCreationTime   As Currency
  ftLastAccessTime  As Currency
  ftLastWriteTime   As Currency
  nFileSizeHigh    As Long
  nFileSizeLow    As Long
  dwReserved0     As Long
  dwReserved1     As Long
  cFileName(1 To MAX_PATH * 2) As Byte 'Unicode
  cAlternate(1 To 14 * 2) As Byte    'Unicode
End Type


Private Declare Function FindFirstFile _
       Lib "kernel32" Alias "FindFirstFileW" _
        (ByVal lpFileName As Long, _
        lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function FindNextFile _
       Lib "kernel32" Alias "FindNextFileW" _
         (ByVal hFindFile As Long, _
         lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function FindClose _
       Lib "kernel32" _
         (ByVal hFindFile As Long) As Long

'-------------------------------------------------------------

Sub Try_Start()
  Dim myPath As String
  Dim strFind As String
  Dim f As String
  Dim n&
  Dim myList() As String
  
  myPath = "D:\(Data)"
  strFind = "abc.*"
  FindFile myPath, strFind, myList(), n '★呼び出し
  
  If n Then
    MsgBox Join(myList, vbCr), , strFind & " ---> " & n & " Files"
  Else
    MsgBox "該当ファイルなし"
  End If
  
End Sub


Private Sub FindFile(Pathname$, strFind$, myList$(), _
           fCount&, Optional SearchChild As Boolean = True)
 Dim p As String
 Dim fDATA As WIN32_FIND_DATA
 Dim f As String
 Dim hFile As Long

 If Right$(Pathname, 1) <> "\" Then Pathname = Pathname & "\"
 strFind = Lcase$(strFind)
 p = Pathname & "*.*"
 
 hFile = FindFirstFile(StrPtr(p), fDATA)
 If hFile = INVALID_HANDLE_VALUE Then Exit Sub
 Do
   f = fDATA.cFileName
   f = Left$(f, InStr(f, vbNullChar) - 1)
   If (fDATA.dwFileAttributes And vbDirectory) = 0 Then '<File> なら
     If Lcase$(f) Like strFind Then
       fCount = fCount + 1
       ReDim Preserve myList(1 To fCount)
       myList(fCount) = Pathname & f
     End If
     
   ElseIf Left$(f, 1) <> "." Then        '<Directory>なら
     If SearchChild Then
       FindFile Pathname & f, strFind, myList(), fCount
     End If
   End If
 Loop While FindNextFile(hFile, fDATA)
 FindClose hFile

End Sub

【58263】Re:再帰処理でのファイル検索
発言  熊谷隆史  - 08/10/15(水) 13:43 -

引用なし
パスワード
   こんにちは。
> 上のはInternet Archiveの混み具合で
> 検索結果が変わることはまあ、考えられることです。

本題と無関係なのですが、
誤って伝わっても何なので一応、補足。

これはFailed Connection等のエラーが返される時と
正常に検索結果が得られる時があると言う意味で
書きました。

Internet Archiveネタでアレなのですが
結局、リンク元とリンク先のどちらのページも
保存してあって初めて辿れるので、
全て探し切れないのが残念。
(リンク先だけ保存されてるケースなど)
検索エンジン復活して欲しいです。

# ONさん、kanabunさん、neptuneさん、jetさんレスありがとうございました。

【58271】Re:再帰処理でのファイル検索
お礼  ON  - 08/10/15(水) 19:40 -

引用なし
パスワード
   ▼熊谷隆史 さん ありがとうございます


>Internet Archiveネタでアレなのですが
>結局、リンク元とリンク先のどちらのページも
>保存してあって初めて辿れるので、
>全て探し切れないのが残念。

ん〜、完全には理解できませんでしたが


グーグルで検索キーに
tp://web.archive.org/web/20031023095333/tp://www2.moug.net/app/bbs/message.php?cat=acm_v&id=2003060947+++++
をいれると
Q&A|Excel (VBA)|CreateFile が失敗するとき
tp://www.moug.net/faq/viewtopic.php?t=32692

Internet Archiveで検索キーに
tp://web.archive.org/web/20031023095333/tp:/www2.moug.net/app/bbs/message.php?cat=acm_v&id=2003060947+++++
をいれると
指定フォルダのファイル一覧取得含むサブフォルダ
tp://web.archive.org/web/20031023095333/tp:/www2.moug.net/app/bbs/message.php?cat=acm_v&id=2003060947+++++

が掛かります

で、なんとなく納得みたいなです・・・


>検索エンジン復活して欲しいです。
は、?? 
よくわかりませんでした

【58333】Re:再帰処理でのファイル検索
発言  熊谷隆史  - 08/10/20(月) 10:47 -

引用なし
パスワード
   ▼ON さん:
こんにちは。
# あまり、引っ張るものでも無いのですが。

> >検索エンジン復活して欲しいです。
> は、?? 
> よくわかりませんでした

「Internet Archive 検索エンジン」でGoogle検索すると
出てきますね(Recall)。
http://internet.watch.impress.co.jp/cda/news/2003/09/08/377.html
# 現在は停止中。

個人的にはGoogle 2001よりサイト内検索(GoogleでInternet Archiveの)出来るように
してくれと言うのがまあ、正直なトコロです。

【58871】Re:再帰処理でのファイル検索
お礼  ON  - 08/11/15(土) 0:23 -

引用なし
パスワード
   ▼熊谷隆史 さん:
大変遅くなりました m(_ _)m

ありがとうございます
Recall
http://web.archive.org/web/*/http://recall.archive.org/
2004年頃しか動いてないようですね
使用したことがないのでどのような動作だったのかよくわかりませんが
きっと、使えればとても便利そうな気がします

熊谷隆史さん が、過去ログをアップされていて、どうされているのか
不思議だったのですが

CreateFile が失敗するとき
の最後の方に詳しい書き込みがありました
なるほどです

あわせて勉強になりました
ありがとうございました

今後もよろしくお願いいたします

4015 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free