1

以下は、マシン上にあるファイルの数をカウントするかなり単純な関数です。「C:\」で呼び出され、実行には約5秒かかります。しばらく実行していないか、最初にRAMクリアプログラムを実行していない限り、60秒以上かかります。毎回新しいスキャンを実行しているので(つまり、このスキャンだけなので、プログラムの新しいインスタンスを開始しているので)キャッシュされている可能性があるとは思いませんでしたが、おそらくメモリ割り当てに関連していますか?その高速実行を毎回実行する方法、またはそれが実行できない理由についてのアイデアはありますか?他のプログラム(SpaceMongerなど)は、RAMをクリアしたり、実行の合間に長時間待機したりしても、10秒でファイルの総数を取得できます。したがって、必ずしもVBである必要はありませんが、これを行う方法は間違いなくあります。

Private Function countFiles(Name As String) As Long
    On Error GoTo ErrorHandler
    DoEvents
    Const CurMthd = "countFiles"
          Dim retval As Long
13        Dim FindData As win.WIN32_FIND_DATA
14        Dim SearchPath As String
15        Dim FileName As String
17        Dim SearchHandle As Long
          If Right(Name, 1) <> "\" Then Name = Name & "\"
19        SearchPath = Name & "*.*"
20        SearchHandle = win.FindFirstFile(SearchPath, FindData)
          Do
              DoEvents
'             g_Cancel = True
              If g_Cancel Then
                countFiles = retval
                Exit Function
            End If
22            If SearchHandle = win.INVALID_HANDLE_VALUE Or SearchHandle =     ERROR_NO_MORE_FILES Then Exit Do
23            FileName = dsMain.RetainedStrFromPtrA(VarPtr(FindData.cFileName(0)))
24            If AscW(FileName) <> 46 Then
                    If (FindData.dwFileAttributes And win.FILE_ATTRIBUTE_DIRECTORY)     Then
                        retval = retval + countFiles(Name & FileName)
                    Else
                        retval = retval + 1
                    End If
28            End If
29        Loop Until win.FindNextFile(SearchHandle, FindData) = 0
    win.FindClose SearchHandle
    countFiles = retval
    Exit Function
ErrorHandler:
    Debug.Print "Oops: " & Erl & ":" & Err.Description
    Resume Next
End Function
4

1 に答える 1

1

オペレーティングシステム自体が、ディスクから読み取ったデータをキャッシュします。これは完全にあなたのプログラムの外にあり、あなたはそれを実際に制御することはできません。したがって、「RAMクリア」プログラムを実行すると、これらのキャッシュがクリアされます。これが、これらの「RAMクリア」プログラムが一般的に完全に役に立たない理由です。ご覧のとおり、キャッシュを空にすると、プログラムの実行速度が低下します。

于 2008-09-26T18:22:16.540 に答える