Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[c# .net] letzten zugriffszeitpunk einer datei ermitteln

Empfohlene Antworten

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ß

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

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.

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.

Ich benutze auch nicht mehr Last Access Time sondern Last Write Time =)

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

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?

"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... :rolleyes:

Nee das natürlich nicht, nur wie kann ich das beheben?

Gleicher Dateiname ist nicht vorhanden in dem Verzeichnis!

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.

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.

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))

tausch es um

Hatter noch nicht?!

Er meinte doch, dass die Pfade bei ihm der Schlüssel sind... :rolleyes:

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:

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.

Dazu siehe hier (mehr infos) und hier, (tortoisesvn) ist glaube ich sogar unter GNU-Lizens^^, kannst ja mal reinschauen.

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:

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.

Jetzt hast du ja n Dictionary (2 Felder - Key(dateinamen) und Value(Datum)) und nicht mehr "nur" ne Liste...

Du schaffst das schon^^

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?

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

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.

dankeschööööön Kosinator, es funktioniert alles wunderbar =)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.