3. Juli 200916 j 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ß
3. Juli 200916 j 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
3. Juli 200916 j vllt. noch n Using um die Liste Wird nicht gehen. List<T> ist nicht von IDisposable abgeleitet.
3. Juli 200916 j 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.
3. Juli 200916 j 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.
6. Juli 200916 j 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
6. Juli 200916 j 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?
6. Juli 200916 j "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...
6. Juli 200916 j Nee das natürlich nicht, nur wie kann ich das beheben? Gleicher Dateiname ist nicht vorhanden in dem Verzeichnis!
6. Juli 200916 j 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.
6. Juli 200916 j 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.
6. Juli 200916 j 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))
7. Juli 200916 j 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:
7. Juli 200916 j 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.
7. Juli 200916 j Dazu siehe hier (mehr infos) und hier, (tortoisesvn) ist glaube ich sogar unter GNU-Lizens^^, kannst ja mal reinschauen.
8. Juli 200916 j 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:
8. Juli 200916 j 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.
8. Juli 200916 j Jetzt hast du ja n Dictionary (2 Felder - Key(dateinamen) und Value(Datum)) und nicht mehr "nur" ne Liste... Du schaffst das schon^^
9. Juli 200916 j 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?
9. Juli 200916 j 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
9. Juli 200916 j 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.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.