2016-06-20 10 views
0

ich eine Aufgabe habe Dateien aus einem Ordner mit C#, die Namenskonvention der Dateien zu verarbeiten, ist wie folgt:Dateinamen aus einem Ordner abrufen, während neue Dateien, die von anderen Anwendungen erstellt werden

0000001.log 
0000002.log 
.... 
00nnnnn.log 

Bei einer Parameter x, alle Dateien mit dem Namen kleiner als x werden verarbeitet. Nach der Verarbeitung wird die Datei gelöscht.

Gleichzeitig fügt eine andere Anwendung diesem Ordner fortlaufend Protokolldateien mit einer inkrementellen Nummer hinzu.

Ich weiß, ich kann GetFiles oder EnumerateFiles & linq in C# verwenden, um die Dateien zu filtern, die ich brauche.

Wenn ich richtig verstehe, werden diese beiden Methoden zuerst alle Dateinamen in den Speicher laden und dann diejenigen herausfiltern, die ich brauche.

Seit nnnn ist eine ziemlich große Zahl, ich denke, wird es effizienter sein, wenn ich eine Möglichkeit haben, nur die Dateinamen abzurufen ich brauche, dh x Anzahl der Dateien, ohne alle Dateinamen zu Laden

Ist das möglich?

+0

'EnumerateFiles' ruft nicht alle übereinstimmenden Dateinamen zuerst im Speicher ab. Siehe Anmerkungen hier https://msdn.microsoft.com/en-us/library/dd383458(v=vs.110).aspx, oder wenn sehend glaubt, folgen Sie dem Code dafür auf referencesource.microsoft.com, oder befestigen Sie ProcessMonitor zu einer Test-App und Sie werden sehen, dass es die Dateinamen inkrementell abruft. ** Wenn ** Sie die Iteration vorzeitig beenden, zahlen Sie nicht die gesamten Kosten. – steve16351

+0

@Kason, nein, das wird nicht funktionieren, da ich die Datei von 1 bis x brauche. –

+0

@ steve16351, Ja Ich wusste, dass EnumerateFiles früh beendet werden kann, aber es scheint keine Garantie zu sein, dass es nach Dateinamen in aufsteigender Reihenfolge sortiert. Bitte vergessen Sie nicht, dass die andere Anwendung die Datei zum selben Ordner hinzufügen wird. –

Antwort

0

Sie können Filesystemwatcher verwenden, um eine Benachrichtigung über eine neue Datei erstellen zu erhalten:

System.IO.FileSystemWatcher m_Watcher = new System.IO.FileSystemWatcher(); 
m_Watcher.Path = folderPath; 
m_Watcher.Filter = strFilter; 
m_Watcher.NotifyFilter = NotifyFilters.LastAccess | 
        NotifyFilters.LastWrite | 
        NotifyFilters.FileName | 
        NotifyFilters.DirectoryName; 

m_Watcher.Changed += new FileSystemEventHandler(OnChanged); 
m_Watcher.Created += new FileSystemEventHandler(OnChanged); 

Während strFilter die Filter für die Dateinamen zum Beispiel: „* .txt“;

Für weitere Informationen https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx

0

Sie können eine machen für iterate und fügen Sie in it.If ein, wenn die Bedingung die Bedingung wahr ist, dann diese Datei looad.

Verwandte Themen