Horstiii Geschrieben 3. Juli 2009 Geschrieben 3. Juli 2009 Hallo, ich hab ein windows form und muss von 2 ordnern den letzten zugrisszeitpunkt der einzelnen dateien ermitteln. ich weiß schon das ich das irgendwie mit Directory.GetLastAccessTime machen muss. aber wie ich alle datein bekomme ist die frage..... hier kann mir bestimmt einer helfen =) gruß Zitieren
Kosinator Geschrieben 3. Juli 2009 Geschrieben 3. Juli 2009 Quick n dirty, sollte aber für deine Zwecke reichen: using System; using System.Collections.Generic; using System.IO; using System.Windows.Forms; namespace ExampleZugriffszeiten { public partial class Form1 : Form { public Form1() { InitializeComponent(); List<DateTime> lezteZugriffszeitListe = new List<DateTime>(); //foreach (string datei in Directory.GetFiles(File.GetLastAccessTime(Properties.Settings.Ordnername)) foreach (string datei in Directory.GetFiles(@"C:\testTemp\")) { lezteZugriffszeitListe.Add(File.GetLastAccessTime(datei)); } foreach (DateTime zeit in lezteZugriffszeitListe) { Console.WriteLine(zeit.ToString()); } //DateTime lezteZugriffszeit = File.GetLastAccessTime(Properties.Settings.Dateiname); DateTime lezteZugriffszeit = File.GetLastAccessTime(@"C:\TestTemp\test.txt"); MessageBox.Show(lezteZugriffszeit.ToString()); } } } vllt. noch n Using um die Liste oder zumindest Clear() bei mehrfachem gebracuch. Ist nur n Ansatz^^ Gruß, Kosi Zitieren
TDM Geschrieben 3. Juli 2009 Geschrieben 3. Juli 2009 vllt. noch n Using um die Liste Wird nicht gehen. List<T> ist nicht von IDisposable abgeleitet. Zitieren
Horstiii Geschrieben 3. Juli 2009 Autor Geschrieben 3. Juli 2009 Danke schonmal, aber kann ich jetzt noch zuordnen welcher datei welches datum zugeordnet ist? Es sollen nachher 2 ordner synchronisiert werden, dafür muss ich ja wissen welche datei neuer ist, damit die nicht überschrieben wird. Zitieren
Bubble Geschrieben 3. Juli 2009 Geschrieben 3. Juli 2009 ich hab ein windows form und muss von 2 ordnern den letzten zugrisszeitpunkt der einzelnen dateien ermitteln. Das wird nicht unter allen Betriebssytemen funktionieren, da die Last Access Time, abhängig von der Betriebssystemversion, in der Voreinstellung nicht (mehr, immer) aktualisiert wird. Zitieren
Horstiii Geschrieben 3. Juli 2009 Autor Geschrieben 3. Juli 2009 Ich benutze auch nicht mehr Last Access Time sondern Last Write Time =) Zitieren
Kosinator Geschrieben 6. Juli 2009 Geschrieben 6. Juli 2009 Versuchs mal hier mit: using System; using System.Collections.Generic; using System.IO; using System.Windows.Forms; namespace ExampleZugriffszeiten { public partial class Form1 : Form { public Form1() { InitializeComponent(); Dictionary<DateTime, string> zeitDateiname = new Dictionary<DateTime, string>(); foreach (string datei in Directory.GetFiles(@"C:\testTemp\")) { zeitDateiname.Add(File.GetLastWriteTime(datei), datei); } foreach (KeyValuePair<DateTime, string> kvp in zeitDateiname) { Console.WriteLine("Datei : "+kvp.Value+ " zuletzt geändert um "+kvp.Key); } zeitDateiname.Clear(); } } } Türlich kannst du auch den Namen der Datei(en) als Key nehmen. Viel spaß damit Zitieren
Horstiii Geschrieben 6. Juli 2009 Autor Geschrieben 6. Juli 2009 Kosinator, deine Lösung ist gut, nur leider bekomme ich immer eine Exception wenn ich ausführe. "System.ArgumentException" wurde aufgefangen. Message="Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt." Source="mscorlib" StackTrace: bei System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) bei System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) bei System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) bei WindowsFormsApplication1.Backup.pb_sync_Click(Object sender, EventArgs e) in C:\Dokumente und Einstellungen\User\Eigene Dateien\Visual Studio 2008\Projects\Backup_Win\Backup_Win\Form1.cs:Zeile 137. InnerException: Hat da wer ne idee was das sein könnte? Zitieren
TDM Geschrieben 6. Juli 2009 Geschrieben 6. Juli 2009 "System.ArgumentException" wurde aufgefangen. Message="[COLOR="Red"]Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt.[/COLOR]" Hat da wer ne idee was das sein könnte? Sag jetzt nicht, dass der Text unverständlich ist... Zitieren
Horstiii Geschrieben 6. Juli 2009 Autor Geschrieben 6. Juli 2009 Nee das natürlich nicht, nur wie kann ich das beheben? Gleicher Dateiname ist nicht vorhanden in dem Verzeichnis! Zitieren
TDM Geschrieben 6. Juli 2009 Geschrieben 6. Juli 2009 Gleicher Dateiname ist nicht vorhanden in dem Verzeichnis! Das erlaubt das Betriebssystem so und so nicht... Also die Dateinamen sind bei dir die Schlüssel? Nehm doch lieber den absoluten Pfad. Zitieren
Horstiii Geschrieben 6. Juli 2009 Autor Geschrieben 6. Juli 2009 Ne die Dateinamen sind nicht die Schlüssel.... es sind die abslouten Pfade Ich kann mir das nur so erklären, dass er eine Datei zweimal hinzufügen will, warum auch immer. Zitieren
Kosinator Geschrieben 6. Juli 2009 Geschrieben 6. Juli 2009 Dictionary<DateTime, string> zeitDateiname = new Dictionary<DateTime, string>(); DateTime ist der Schlüssen, String (Dateiname) der Wert, tausch es um, (also: Dictionary<string, DateTime> dateinameZeit = new Dictionary<string, DateTime>(); ....) dann solltest du das Problem nicht bekommen, ach ja, und noch n paar Try-catches drum (IO-Exception, z.B. beim löschen einiger Dateien, während das Programm läuft..., oder wegen fehlender zugriffsberechtigung (datei ist gerade in Aktion)) Zitieren
TDM Geschrieben 7. Juli 2009 Geschrieben 7. Juli 2009 tausch es um Hatter noch nicht?! Er meinte doch, dass die Pfade bei ihm der Schlüssel sind... oder wegen fehlender zugriffsberechtigung (datei ist gerade in Aktion)) Böse. Dateien auflisten während sie gerade in Benutzung sind, ist kein Problem. Aber bei fehlender Zugriffsberechtigung (lesen nicht erlaubt) wird das schon bei Directory.GetFiles auftreten, da kann er die Schleife ja gleich vergessen. :floet: Zitieren
Horstiii Geschrieben 7. Juli 2009 Autor Geschrieben 7. Juli 2009 Danke bisher an alle, funktioniert wunderbar. Das einzige was mich jetzt noch stört, ist das ich nicht drauf komme wie ich die "Datumse" der einzelnen Dateinen vergleiche. Achja und damit ihr wisst was ich überhaupt vor habe, ich bin dabei ein Programm zum syncronisieren von 2 ordnern zu schreiben. Zitieren
Kosinator Geschrieben 7. Juli 2009 Geschrieben 7. Juli 2009 Dazu siehe hier (mehr infos) und hier, (tortoisesvn) ist glaube ich sogar unter GNU-Lizens^^, kannst ja mal reinschauen. Zitieren
TDM Geschrieben 8. Juli 2009 Geschrieben 8. Juli 2009 Achja und damit ihr wisst was ich überhaupt vor habe, ich bin dabei ein Programm zum syncronisieren von 2 ordnern zu schreiben. Das Programm soll aber nur bei Ausführung synchronisieren, ja? Ansonsten würd ich eher dazu raten. :hells: Zitieren
Horstiii Geschrieben 8. Juli 2009 Autor Geschrieben 8. Juli 2009 Jaa, soll schon nur bei Ausführung syncronisieren =) Mit der ArrayList hatte ich zuvor schoneinmal probiert, aber da konnte ich nachher nicht mehr zuordnen welche Datei welches Datum hatte. Zitieren
Kosinator Geschrieben 8. Juli 2009 Geschrieben 8. Juli 2009 Jetzt hast du ja n Dictionary (2 Felder - Key(dateinamen) und Value(Datum)) und nicht mehr "nur" ne Liste... Du schaffst das schon^^ Zitieren
Horstiii Geschrieben 9. Juli 2009 Autor Geschrieben 9. Juli 2009 Wie geh ich denn da am besten dran? ICh würde jetzt sagen, dass ich mit ner while-schleife oder so durchlaufe. Kann ich denn Key und Value quasie als ein wert in einem array speichern? Zitieren
Kosinator Geschrieben 9. Juli 2009 Geschrieben 9. Juli 2009 Hast doch schon alles was du brauchst... Hier nochmal schön, aber wehe du streichst Loorbeeren ein^^ using System.Collections.Generic; using System.IO; using System.Windows.Forms; using System; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); /* Dictionary<string, DateTime> dateinameZeit = new Dictionary<string, DateTime>(); DateTime vorgestern = System.DateTime.Now.Date.AddDays(-2); foreach (string datei in Directory.GetFiles(@"C:\testTemp\")) { dateinameZeit.Add(datei, File.GetLastWriteTime(datei)); } foreach (KeyValuePair<string, DateTime> kvp in dateinameZeit) { if (kvp.Value <= vorgestern) { Console.WriteLine("Datei:" + kvp.Key + "wurde Vorgestern oder früher geändert."); } } dateinameZeit.Clear(); */ // Oder, wenn die Dateinamen = bleiben, und du 2 Ordner (mit =en Dateien) gegeneinander Prüfen willst (syncronisation) string erstesVerzeichniss = @"C:\TestTemp\"; string zweitesVerzeichniss = @"C:\TestTempAndererOrdner\"; Dictionary<string, DateTime> dateinameZeit = new Dictionary<string, DateTime>(); Dictionary<string, DateTime> dateinameZeitAndererOrdner = new Dictionary<string, DateTime>(); if (Directory.Exists(erstesVerzeichniss)) { foreach (string datei in Directory.GetFiles(erstesVerzeichniss)) { dateinameZeit.Add(datei, File.GetLastWriteTime(datei)); } } else { MessageBox.Show("nope"); Application.Exit(); Application.Restart(); } if (Directory.Exists(zweitesVerzeichniss)) { foreach (string datei in Directory.GetFiles(zweitesVerzeichniss)) { dateinameZeitAndererOrdner.Add(datei, File.GetLastWriteTime(datei)); } } else { MessageBox.Show("nope"); Application.Exit(); Application.Restart(); } if (dateinameZeit.Count != dateinameZeitAndererOrdner.Count) { MessageBox.Show("NOPE, keine =e Anzahl von Dateien", "NOPE", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); Application.Restart(); } foreach (KeyValuePair<string, DateTime> kvp in dateinameZeit) { foreach (KeyValuePair<string, DateTime> kvpAndererOrdner in dateinameZeitAndererOrdner) { if (kvp.Key == kvpAndererOrdner.Key) // =e Datei { if (kvp.Value <= kvpAndererOrdner.Value.AddDays(-2)) // Je nachdem, auch .Date und dann ver=en ist sinnvoll { Console.WriteLine("Datei:" + kvp.Key + "mehr als 2 Tage asyncron mit Datei" + kvpAndererOrdner.Key); Application.Restart; } } } } dateinameZeit.Clear(); dateinameZeitAndererOrdner.Clear(); } } } einfach Copy&Paste, musst nur Pfade ändern (erstesVerzeichniss, zweitesVerzeichniss). viel Spaß damit. p.s.: bei Sorgen oder Problemen, einfach melden Zitieren
Kosinator Geschrieben 9. Juli 2009 Geschrieben 9. Juli 2009 btw, schöner ist es Das Dictionary ordentlich zu benutzen, also mit GetValueByKey(Key) den dateinamen eines dict. dem anderen übergeben, oder dict schachteln, aber ich denke so wie es ist ist es am leichtesten zu verstehen. Zitieren
Horstiii Geschrieben 16. Juli 2009 Autor Geschrieben 16. Juli 2009 dankeschööööön Kosinator, es funktioniert alles wunderbar =) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.