3 Stimmen

Regulärer Ausdruck zum Filtern von Dateien im OpenFileDialog

Ich möchte wissen, wie man Dateien in einem Dialogfeld zum Öffnen von Dateien (in Winforms) filtern kann. basierend auf einem regulären Ausdruck. Die Dateien haben alle dieselben Erweiterungen (.xml). Große Dateien sind in mehrere Dateien mit demselben Namen aufgeteilt, die nur mit _1 getrennt werden müssen ... Wir wollen nur die Dateien ohne _1 anzeigen (erste Datendatei)

Das Dialogfeld "Datei öffnen" verfügt über einen Eigenschaftsfilter, aber ich weiß nicht, wie ich diesen in unserem Dateinamensformat angeben kann, daher der reguläre Ausdruck.

Danke schön, Niki

3voto

Gishu Punkte 130442

Ich glaube nicht, dass du es schaffst. mit der Filter-Eigenschaft von OpenFileDialog, die lediglich die Liste der Dateien nach der Erweiterung filtert.

Ich denke, Sie müssen den Benutzer eine xml-Datei auswählen lassen, validieren und dann den Dialog erneut aufrufen, wenn es eine _1-Datei ist. Sie können das FileOK-Ereignis abonnieren und die Validierung dort einfügen. Sie können reguläre Ausdrücke verwenden, um den Dateinamen hier zu validieren. Das ist das Beste, was man tun kann. denke ich.

3voto

Cheeso Punkte 184210

Le site OpenFileDialogEx, beschrieben in diesem CodeProject-Artikel ist eine Erweiterung des standardmäßigen OpenFileDialogs. Der Hauptzweck dieser Erweiterung besteht darin, die Anzeige des Dialogs zu ändern, aber es gibt auch einige zusätzliche Funktionen. Zum Beispiel fügt OFDEx einige Ereignisse hinzu, z. B. Datei geändert, Ordner geändert usw.

Jemand hat darauf hingewiesen, dass die CDN_INCLUDEITEM-Benachrichtigung den Wunsch zu erfüllen scheint, die Liste der im Dialogfeld angezeigten Dateien zu filtern. Das scheint der Fall zu sein, ist es aber nicht. CDN_INCLUDEITEM tut nicht das, was Sie vielleicht denken oder wollen.

Nach Angaben von dieser MSDN Mag Artikel ,

I OFN_ENABLEINCLUDENOTIFY erstellen, sendet Windows Ihrer Hook-Prozedur eine CDN_INCLUDEITEM Benachrichtigung für jedes Element, das es der der offenen Liste hinzufügt. Wenn Sie FALSE zurückgeben, schließt Windows das Element aus. Das Problem ist, dass Windows Sie nicht benachrichtigt, wenn o wie Namespace-Erweiterungen. Wenn Sie die Dokumentation durch eine Vergrößerungsglas lesen, ist der Druck ganz klar: "Das Dialogfeld enthält immer Elemente, die sowohl die die SFGAO_FILESYSTEM und SFGAO_FILESYSANCESTOR Attribute haben, unabhängig von dem Wert, der von CDN_INCLUDEITEM ZURÜCKGEGEBEN WIRD." Offensichtlich haben die [ ] für ihre eigenen Zwecke hinzugefügt, die nicht das Filtern gewöhnlicher Dateinamen beinhaltete.

Mit anderen Worten, als Antwort auf CDN_INCLUDEITEM können Sie für normale Dateien nicht FALSE zurückgeben, um sie vom Dialog auszuschließen. Im Gegensatz zum Dokument, das besagt, dass die Antwort von CDN_INCLUDEITEM für reguläre Dateien ignoriert wird, ist meiner Erfahrung nach CDN_INCLUDEITEM nicht einmal gesendet für normale Dateien, zumindest nicht auf meinem Vista-Rechner.

Ist es also möglich, Dateien dynamisch auszuschließen? Nun, ja, in C++. Als Antwort auf die CDN_FOLDERCHANGED-Meldung können Sie den Inhalt der CListCtrl, die die Dateien enthält, abrufen und festlegen. Ich habe noch nicht herausgefunden, wie man diese Liste in C# einstellen kann.

1voto

Der OpenFileDialog unterstützt dies nicht. Eine Alternative ist die Verwendung eines 3rd Party Controls wie FileView mit der Sie Elemente nach beliebigen Kriterien wie regulären Ausdrücken filtern können.

0voto

Pat Punkte 5260

Dies sollte mit dem folgenden Filter möglich sein: Datendateien|*_1.xml

-1voto

Adam Rosenfield Punkte 373807

Ich bin nicht sicher, wie man es in C# mit WinForms tun, aber in C++, was Sie tun würden, ist eine benutzerdefinierte Hook-Prozedur zu installieren und für die CDN_INCLUDEITEM Benachrichtigung zu hören. Dann überprüfen Sie jeden Dateinamen gegen Ihre Regex. Siehe http://msdn.microsoft.com/en-us/library/ms646960(VS.85).aspx#_win32_Filters .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X