Zum Inhalt springen

[c# .net] letzten zugriffszeitpunk einer datei ermitteln


Empfohlene Beiträge

Geschrieben

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ß

Geschrieben

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

Geschrieben

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.

Geschrieben

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.

Geschrieben

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

Geschrieben

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?

Geschrieben

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

Geschrieben

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.

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

Geschrieben

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:

Geschrieben

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.

Geschrieben

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:

Geschrieben

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.

Geschrieben

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?

Geschrieben

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

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...