Ein paar Fragen

Grüß Sie,

ich hätte ein paar Probleme und ich hoffe irgendwer von euch hat auch Lösungen :smile:

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 :wink:) 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 hoffe ihr könnt mir helfen

mfg
Michael P. Schieferer

Hi Michi!

Meine Comments im Text unten:

Grüß Sie,

ich hätte ein paar Probleme und ich hoffe irgendwer von euch
hat auch Lösungen :smile:

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 :wink:) 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.

Ich hoffe ihr könnt mir helfen

mfg
Michael P. Schieferer

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

2. Weiters schreibe ich gerade ein Programm das (wenn
es einmal fertig ist und auch funktioniert :wink:) 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.

MfG
Roland

Danke, Archivesuche funktioniert!
siehe Titel

Noch eine Frage:

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

Private Const BIF_RETURNONLYFSDIRS = 1
Private Const MAX_PATH = 260

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

Hallo Michael,

versuchs’ mal hiermit:

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.

Gruß

Sculpture

1 Like

hat wiederum hervorragend funktioniert!! Danke

doch eines bräucht ich noch :smile:
Es muss eine Option geben ob Unterordner auch durchsucht werden oder nicht!

danke nochmals
mfg
Michael P: Schieferer

Hallo Michael,

soso, was darf’s denn noch sein :wink:

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 :smile:

1 Like

mit der windows scription host bibliothek geht das ganze um ein vielfaches einfacher leute!

Ja und wie :smile:

mit der windows scription host bibliothek geht das ganze um
ein vielfaches einfacher leute!

WSH Howto
Also Michi!

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

Viel Spaß, Stefan.

2 Like

Danke, WSH funzt wunderbar / Drag’n Drop Frage
Da ich noch nie mit Drag 'n Drop gearbeitet habe hier wirklich die letzte Frage :smile:

Ich möchte nun die in der ListBox angegebenen Dateien per Drag 'n Drop verschieben/kopieren?

Wie geht das???

Hi Michi!

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]

1 Like

Die Funktionalität sollte folgende sein:

  1. Der User gibt das Verzeichnis an.
  2. Das Programm sucht un alle Dateien bei denen das Archiv Atribut gesetzt ist, und gibt sie in einer List Box aus.
  3. 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.)

Soweit klar?

(Und den Bewertungspunkt hast dir auch verdient :wink:)

Hi Michi!

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?

:wink: (ned bess sein)

Stefan.

1 Like

dankeschen - vorschlag angenommen - bin eh bis ca. 18:00 in der online