ich hätte ein paar Probleme und ich hoffe irgendwer von euch hat auch Lösungen
1. Ich bräuchte zwecks Datensicherung und Wiederherstellung ein Programm das die Festplatte (oder nur Ordner) durchsucht und mir alle Dateien und Ordner auflistet bei denen das Archiv Attribut gesetzt ist. Mein Problem dabei ist wie kann ich nach dem Archivattribut suchen???
2. Weiters schreibe ich gerade ein Programm das (wenn es einmal fertig ist und auch funktioniert ) zwei Dateien nach differenzen durchsucht aber komme überheupt nicht weiter. Mein erster Ansatz war das ich zwei txt Files sukzessive zeichen für zeichen „abgehe“ und den string mit dem zweitem txt file vergleiche! Ist aber enorm speicherfressend, langsam und ausserdem gefällt mir die Lösung nicht!
Noch etwas zu 2: Am Besten würde mir gefallen wenn ich zwei Files im warsten Sinne des Wortes „übereinanderlegen“ könnte und die Differenzen visuell erkennbar machen könne - aber dazu fehlt mir die geringste Idee wie ich soetwas machen könnte!
ich hätte ein paar Probleme und ich hoffe irgendwer von euch
hat auch Lösungen
1. Ich bräuchte zwecks Datensicherung und
Wiederherstellung ein Programm das die Festplatte (oder nur
Ordner) durchsucht und mir alle Dateien und Ordner auflistet
bei denen das Archiv Attribut gesetzt ist. Mein Problem dabei
ist wie kann ich nach dem Archivattribut suchen???
Über den Windows Scripting Host. Objekte: Scripting.FileSystemObjekt, Scipring.File
2. Weiters schreibe ich gerade ein Programm das (wenn
es einmal fertig ist und auch funktioniert ) zwei Dateien
nach differenzen durchsucht aber komme überheupt nicht weiter.
Mein erster Ansatz war das ich zwei txt Files sukzessive
zeichen für zeichen „abgehe“ und den string mit dem zweitem
txt file vergleiche! Ist aber enorm speicherfressend, langsam
und ausserdem gefällt mir die Lösung nicht!
Solange du den Speicher nicht sukzessive vollaufen läßt müßte Deine Lösung performant sein. Probier’s mal mit Zeilen-Vergleich, sollte erheblich schneller sein. Kommt aber darauf an, wie Du welche Differenzen ausgeben lassen willst.
Noch etwas zu 2: Am Besten würde mir gefallen wenn ich
zwei Files im warsten Sinne des Wortes „übereinanderlegen“
könnte und die Differenzen visuell erkennbar machen könne -
aber dazu fehlt mir die geringste Idee wie ich soetwas machen
könnte!
Schau mal in den OptionPack von Windows. Da gibt es so ein Programm (WinDiff). Vielleicht kannst Du Dir da Ideen holen. Ich schicke Dir auch noch per mail einen besseren Vergleicher.
1. Ich bräuchte zwecks Datensicherung und
Wiederherstellung ein Programm das die Festplatte (oder nur
Ordner) durchsucht und mir alle Dateien und Ordner auflistet
bei denen das Archiv Attribut gesetzt ist. Mein Problem dabei
ist wie kann ich nach dem Archivattribut suchen???
Dim d As String
d = Dir("\*.\*")
Do While d \> ""
If GetAttr(d) \>= vbArchive Then
MsgBox "Archivattribut für " + d + " ist gesetzt."
else
MsgBox "Archivattribut für " + d + " ist nicht gesetzt."
End If
d = Dir
Loop
2. Weiters schreibe ich gerade ein Programm das (wenn
es einmal fertig ist und auch funktioniert ) zwei Dateien
nach differenzen durchsucht aber komme überheupt nicht weiter.
Mein erster Ansatz war das ich zwei txt Files sukzessive
zeichen für zeichen „abgehe“ und den string mit dem zweitem
txt file vergleiche! Ist aber enorm speicherfressend, langsam
und ausserdem gefällt mir die Lösung nicht!
Ich würde nicht Zeichen für Zeichen durchgehen, sondern Blöcke mit einer größeren Anzahl von Bytes nehmen (100 oder 1000 oder was auch immer, sicher auch abhängig von der Größe der Dateien), das sollte die Sache zumindest beschleunigen.
WIeso geht das nicht das ich einen Ordner auswähle???
thx
Option Explicit
Private Declare Function SHBrowseForFolder Lib „Shell32.dll“ (lpbi As BROWSEINFO) As Long
Private Declare Function CoTaskMemFree Lib „ole32.dll“ (ByVal hMem As Long) As Long
Private Declare Function lstrcat Lib „Kernel32“ Alias „lstrcatA“ _
(ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHGetPathFromIDList Lib „Shell32“ _
(ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Type BROWSEINFO
hwndOwner As Long
pidlRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Function NullTrim(StringWert As String)
NullTrim = Left(StringWert, InStr(StringWert, vbNullChar) - 1)
End Function
Public Function Brows(sText As String) As String
Dim X As BROWSEINFO
Dim IDList As Long, RetVal As Long
Dim tmpProgrammName As String
With X
.lpszTitle = lstrcat(sText, „“)
.ulFlags = BIF_RETURNONLYFSDIRS
End With
IDList = SHBrowseForFolder(X)
If IDList 0 Then
tmpProgrammName = Space(MAX_PATH)
RetVal = SHGetPathFromIDList(IDList, tmpProgrammName)
CoTaskMemFree (IDList)
NullTrim (tmpProgrammName)
End If
Brows = tmpProgrammName
End Function
Private Sub Command1_Click()
Dim d, p As String
p = Brows(„Geben Sie bitte einen Ordner an:“) & „*.*“
d = Dir§
Do While d > „“
If GetAttr(d) >= vbArchive Then
MsgBox „Archivattribut für " + d + " ist gesetzt.“
Else
MsgBox „Archivattribut für " + d + " ist nicht gesetzt.“
End If
d = Dir
Loop
End Sub
Grüß dich
1. Ich bräuchte zwecks Datensicherung und
Wiederherstellung ein Programm das die Festplatte (oder nur
Ordner) durchsucht und mir alle Dateien und Ordner auflistet
bei denen das Archiv Attribut gesetzt ist. Mein Problem dabei
ist wie kann ich nach dem Archivattribut suchen???
Dim d As String
d = Dir("*.*")
Do While d > „“
If GetAttr(d) >= vbArchive Then
MsgBox „Archivattribut für " + d + " ist gesetzt.“
else
MsgBox „Archivattribut für " + d + " ist nicht
gesetzt.“
End If
d = Dir
Loop
Private Sub Command1\_Click()
Dim d, p$
p = Brows("Geben Sie bitte einen Ordner an:")
p = Left(p, InStr(p, Chr(0)) - 1) & "\"
d = Dir(p)
Do While d \> ""
If GetAttr(p & d) \>= vbArchive Then
MsgBox "Archivattribut für " + d + " ist gesetzt."
Else
MsgBox "Archivattribut für " + d + " ist nicht gesetzt."
End If
d = Dir
Loop
End Sub
So funktioniert’s. Stichwort: Nulldeterminierte Strings.
So etwas geht am besten rekursiv, nur: die Dir-Funktion kann das nicht, hab das selbst schonmal versucht, d.h., es wird ein wenig komplizierter.
Werde mal mein altes Programm rauskramen, falls ich es noch finde. Ich habe damals die Verzeichnisse, die ich während der Suche gefunden habe in einem Array zwischengespeichert und das danach abgearbeitet.
Gruß
Sculpture
P.S.: Die Strings heißen natürlich nullterminiert, nicht DEterminiert … ups
Ich schreib hier mal eine kleines Beispiel. Als erstes mußt Du aber unter Projekt/Verweise die Bibliothek „Microsot Scripting Runtime“ in Dein Programm einbinden, dann zwei CommandButtons und eine ListBox im Form1 erstellen und abschließend den Code pasten:
Option Explicit
'Globale Variablen
Private bCancel As Boolean
Private wshFSO As Scripting.FileSystemObject
Private Sub Command1\_Click()
GetRoot "C:\"
End Sub
Public Sub GetRoot(ByVal strDrive As String)
Dim wshRootFolders As Scripting.Folders
Dim wshRootFolder As Scripting.Folder
On Error Resume Next
'FileSystenObjekt erstellen
Set wshFSO = New FileSystemObject
'Erstes FoldersObjekt (Kollektion) erstellen
Set wshRootFolder = wshFSO.GetFolder(strDrive)
'Alle FolderObjekte in der Folders-Kollektion durchsuchen
For Each wshRootFolder In wshRootFolders
'Abruch erkennen
DoEvents
If bCancel Then Exit For
'Filesuchprocedure aufrufen
GetFiles wshRootFolder
'Überprüfung auf Subdirectories
If wshRootFolder.SubFolders.Count \> 0 Then
GetSub wshRootFolder
End If
Next wshRootFolder
'Wichtig: Alle Objekt wieder terminieren!
Set wshRootFolders = Nothing
Set wshRootFolder = Nothing
Set wshFSO = Nothing
End Sub
Public Sub GetSub(ByVal wshRoot As Scripting.Folder)
Dim wshSubFolders As Scripting.Folders
Dim wshSubFolder As Scripting.Folder
On Error Resume Next
'Kollektion erstelleb
Set wshSubFolders = wshRoot.SubFolders
'Kollektion durchsuchen
For Each wshSubFolder In wshSubFolders
'Abruch erkennen
DoEvents
If bCancel Then Exit For
'Filesuchprocedure aufrufen
GetFiles wshSubFolder
'Überprüfung auf Subdirectories
If wshSubFolder.SubFolders.Count \> 0 Then
'Die Procedure ruft sich selbst auf
GetSub wshSubFolder
End If
Next wshSubFolder
'Objekttremination
Set wshSubFolders = Nothing
Set wshSubFolder = Nothing
End Sub
Private Sub GetFiles(ByVal wshFileFolder As Scripting.Folder)
Dim wshFiles As Scripting.Files
Dim wshFile As Scripting.File
On Error Resume Next
'FilesObjekt (Kollektion) erstellen
Set wshFiles = wshFileFolder.Files
'Alle FileObjekte der FilesKollektion durchschreiten
For Each wshFile In wshFiles
'Abruch erkennen
DoEvents
If bCancel Then Exit For
'Überprüfung des Fileattributes
If wshFile.Attributes = Archive Then
'Eintragung in die ListBox
List1.AddItem wshFile.Name
End If
Next wshFile
'Objekttermination
Set wshFiles = Nothing
Set wshFile = Nothing
End Sub
Private Sub Command2\_Click()
bCancel = True
End Sub
Da ich von Dir sicher einen Bewertungspunkt bekomme (hoffe mal), erkläre ich auch noch das mit Drag’n’Drop. Nur muß ich vorher wissen, was Du genau willst.
BTW: Wenn Du mit „verschieben/kopieren“ Explorer-Maus-Aktionen meinst, muß ich Dir leider absagen - das ist nur mit einer FileListBox möglich - auch logisch, da in der ListBox nur der Filename ohne jegliche Referenz zum physikalischen File besteht. Für Drag’n’Drop müßte man ein bissl mehr Infos dazupacken.
Wenn Du aber die gefundenen Dateien verschieben oder kopieren möchtest, ist das am besten am einfachsten per Code zu bewerkstelligen: ICH SAG NUR WSH !!!
Beispiel: Ersetze Code von vorher mit:
Private Sub GetFiles(ByVal wshFileFolder As Scripting.Folder)
Dim wshFiles As Scripting.Files
Dim wshFile As Scripting.File
Const strDestFolder As String = "C:\Backup"
On Error Resume Next
'FilesObjekt (Kollektion) erstellen
Set wshFiles = wshFileFolder.Files
'Alle FileObjekte der FilesKollektion durchschreiten
For Each wshFile In wshFiles
'Abruch erkennen
DoEvents
If bCancel Then Exit For
'Überprüfung des Fileattributes
If wshFile.Attributes = Archive Then
'Eintragung in die ListBox
List1.AddItem wshFile.Name
'Kopiere Datei in Zielverzeichnis
wshFile.Copy strDestFolder, False
End If
Next wshFile
'Objekttermination
Set wshFiles = Nothing
Set wshFile = Nothing
End Sub
Hier wird einfach das gefunden File nach XY kopiert. Das Zeilverzeichnis gibst Du entweder als Konstante, Parameter oder als Text einer TextBox der GUI an. Und Fertig ist das Mondgesicht…
Es gibt da noch zig Ausschmückungen, die aber den Rahmen sprengen würden - das Prinzip sollte jetzt aber klar sein, oder?
Wenn’s unbedingt Drag’n’Drop sein soll, dann melde Dich nochmal.
F:\>Stefan
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Das Programm sucht un alle Dateien bei denen das Archiv Atribut gesetzt ist, und gibt sie in einer List Box aus.
Der User kann nun entweder alle, jedes File einzeln, in einen Ordner seiner Wahl kopieren!
(Zusatz: 4. Der User kann von der Listbox die Dateien löschen.)
Punkt 1.) Alles kein Problem
Punkt 2.) Soviel Zeit habe ich wieder auch nicht…
Punkt 3.) Wie wär’s mit a bissal Eigeninitiative?
Punkt 4.) Wenn Du’s erwarten kannst, warte bis um 18h. Dann kann ich Dir das mal ausnahmsweise machen -> ABER dann hackelst des Programmal durch und LERNST, wie Du Dir’s das nächste mal selber machst, alles Roger?