In Dialogbox Ordner und Files auswählen?
-
Guten Morgen
Ich schreibe ein Consolen Program das Daten Vernichtet nach einem bestimmten Verfahren.
Es werden einzelne Dateien oder auch ganze Verzeichnisse unterstützt.Jetzt habe ich gedacht man könnte stat immer den Pfad zur Datei oder Verzeichnis einzugeben(oder hineinzihen), eine Dialogbox öffnen mit GetOpenFileName().
Doch mit der Funktion kann ich nur Dateien auswählen aber keine Ordner! Geht das überhaupt mit der Funktion oder gibts da was anderes?
Den der User soll ja auch ganze Verzeichnisse auswählen können und nicht nur einzelene Files.Wäre schön wenn mir Jemand auf die Sprünge helfen könnte. Danke
-
Hallo Kingston,
als Erstes, gehören Dialogfenster und Funktionen wie GetOpenFileName zur WinAPI-Familie, das heißt für dich, dass dein Programm nicht mehr Konsolenanwendung mehr ist. Aber wenn du schon mal mit Dialogfenstern arbeiten möchtest, dann nimm lieber die Shell-Funktion
SHBrowseForFolder(). Die ist zwar für das Öffnen (Browsen) von directories geeignet, aber wenn du den Flag BIF_BROWSEINCLUDEFILESin derBROWSEINFO-Struktur angibst, kannst du auch Dateien auswählen. Schau doch mal in die MSDN-Dokumentation dieser Funktion rein
Grüße,
Rewind
-
Hallo
Danke die habe ich auch schon gesehen. Doch die kann ab xp schonmal fehlen nach MSDN. Also sei dahingestellt ob win7 sie unterstützt!???
Deshalb wich ich auf die andere Funktion aus! Möchte natürlich eine Funktion die von win2000 bis win7 alles unterstützt.
-
OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(ofn)); WCHAR szFileName[MAX_PATH]; szFileName[0] = L'\0'; ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.hInstance = hInst; // ofn.lpstrFilter = L"All (*.*)/0*.*/0"; ofn.lpstrFilter = L"All (*.*) *.*"; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST; HRESULT hr; if (GetOpenFileName(&ofn)) { hr = m_pPlayer->OpenFile(szFileName);So funktioniert im Prinzip GetOpenFileName(). Musst du halt überlegen ob du aus deiner Konsolenanwendung ein Win32-Windowanwendung machst.
-
kingston00 schrieb:
Doch die kann ab xp schonmal fehlen nach MSDN.
Echt?
Wo steht das?
Wenn du dasNote This section applies to only Windows 2000 and earlier systems.
meinst, dann bezieht sich der Satz nur auf den nachfrolgenden Abschnitt, nämlich Behandlung von Shortcuts (und den angegebenen Beispielcode).
Unten, bei Minimum supported client steht ja Windows XP.
Grundsätzlich ist das so, dass MSDN versucht, veraltete/unsichere/etc. Funktionen aus dem Verkehr zu nehmen und wenn man sie in der aktuellen MSDN-Dokumentation findet, dann werden sie als solche deutlich gekennzeichnet. In solchen Fällen gibt es meistens einen Verweis auf eine bessere Alternative. Wie gesagt, hier ist es nicht gegeben. Wäre auch schrecklich, wenn man uralte Funktionen finden würde, die nur bis WinXP unterstützt werden... Bis jetzt habe ich keine gesehen.
-
Wenn ich es mit SHBrowseForFolder(), woher bekomme ich den Pfad zur Datei??
nsonnsten ist es das was ich gesucht habe.
-
Lese mir auch gerade die M$-Hilfe zu SHBrowseForFolder() durch. Versuche mal das irgendwie zu testen, wie das arbeitet.
-
Wenn der Benutzer mit der Auswahl fertig ist, wird das Ergebnis als pidl gespeichert. Mit der
SHGetPathFromIDList()-Funktion bekommst du deinen gewünschten Pfad:LPITEMIDLIST pidl; TCHAR szPath[MAX_PATH]; BROWSEINFO BI; ZeroMemory(&BI,sizeof(BROWSEINFO)); BI.hwndOwner = hWndDlg; BI.pidlRoot = NULL; BI.pszDisplayName = szPath; BI.lpszTitle = "Choose folder"; BI.ulFlags = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_BROWSEINCLUDEFILES; BI.lpfn = NULL; pidl = SHBrowseForFolder(&BI); if (pidl != NULL) //ob nicht auf Abbrechen geklickt wurde BOOL bGetPathResult = SHGetPathFromIDList(pidl, szPath);Dürfte funktionieren

Grüße,
Rewind
-
// For Directory::GetFiles and Directory::GetDirectories // For File::Exists, Directory::Exists using namespace System; using namespace System::IO; using namespace System::Collections; // Insert logic for processing found files here. void ProcessFile( String^ path ) { Console::WriteLine( "Processed file '{0}'.", path ); } // Process all files in the directory passed in, recurse on any directories // that are found, and process the files they contain. void ProcessDirectory( String^ targetDirectory ) { // Process the list of files found in the directory. array<String^>^fileEntries = Directory::GetFiles( targetDirectory ); IEnumerator^ files = fileEntries->GetEnumerator(); while ( files->MoveNext() ) { String^ fileName = safe_cast<String^>(files->Current); ProcessFile( fileName ); } // Recurse into subdirectories of this directory. array<String^>^subdirectoryEntries = Directory::GetDirectories( targetDirectory ); IEnumerator^ dirs = subdirectoryEntries->GetEnumerator(); while ( dirs->MoveNext() ) { String^ subdirectory = safe_cast<String^>(dirs->Current); ProcessDirectory( subdirectory ); } } int main( int argc, char *argv[] ) { for ( int i = 1; i < argc; i++ ) { String^ path = gcnew String(argv[ i ]); if ( File::Exists( path ) ) { // This path is a file ProcessFile( path ); } else if ( Directory::Exists( path ) ) { // This path is a directory ProcessDirectory( path ); } else { Console::WriteLine( "{0} is not a valid file or directory.", path ); } } }Hier noch ein Beispiel für eine CLR-Konsolenanwendung die rekursiv ein Verzeichnis durchsucht. Damit kannst du alle Files und Subdirectories ermitteln, die in dem Verzeichnis liegen.
-
Das ist allerdings schon ein .NET-Code und gehört nicht in dieses Forum.
-
[Rewind] schrieb:
Das ist allerdings schon ein .NET-Code und gehört nicht in dieses Forum.
Das ist richtig, aber ich denke wir suchen ja noch eine generelle Lösung, wie sich das Ganze am besten realisieren läßt.
-
Ein Lösungsvorschlag (...auch wenn er nicht in dieses Forum gehört
):Man erzeugt eine Windows-Forms Applikation und verwendet OpenFileDialog wenn man nur eine einzelene Datei auswählen möchte und FolderBrowserDialog wenn man ein Verzeichnis auswählen möchte. Hat man das Verzeichnis ausgewählt, kann man es mit der rekursiven Methode durchsuchen. Habe mal ein kleines Testprogramm geschrieben, ... funktioniert ganz gut.
-
Ein Lösungsvorschlag (...auch wenn er nicht in dieses Forum gehört
)Man baue seine Festplatte aus, besorge sich ein kleines Elektronen-Raster-Teleskop und suche den Sektop mit der Bit-Folge "001101101110111011110001111001111011000111110110010111011010110101011000110000111111010001111111111100100101000100010111100111101010" und vergesse nicht die Prüfsumme dazu zu zählen. Dann errechnet man aus den Folgenden 4 Bytes den Offset zum nächsten Sektor. Dort erhält man dann die Liste mit den Dateien, die aber natürlich verlinkt in einem anderen Sektor (oder Cluster) weitergehen. Hat man dies, so kann man das ganze dann rekursiv abarbeiten.
-
Jochen Kalmbach schrieb:
Ein Lösungsvorschlag (...auch wenn er nicht in dieses Forum gehört
)Man baue seine Festplatte aus, besorge sich ein kleines Elektronen-Raster-Teleskop und suche den Sektop mit der Bit-Folge "001101101110111011110001111001111011000111110110010111011010110101011000110000111111010001111111111100100101000100010111100111101010" und vergesse nicht die Prüfsumme dazu zu zählen. Dann errechnet man aus den Folgenden 4 Bytes den Offset zum nächsten Sektor. Dort erhält man dann die Liste mit den Dateien, die aber natürlich verlinkt in einem anderen Sektor (oder Cluster) weitergehen. Hat man dies, so kann man das ganze dann rekursiv abarbeiten.

Du hast dir tatsächlich noch die Mühe gemacht und die Bitfolge eingetippt
Kriegst einen Pluspunkt für den besonders kreativen Vorschlag 
-
Jochen Kalmbach schrieb:
Ein Lösungsvorschlag (...auch wenn er nicht in dieses Forum gehört
)Man baue seine Festplatte aus, besorge sich ein kleines Elektronen-Raster-Teleskop und suche den Sektop mit der Bit-Folge "001101101110111011110001111001111011000111110110010111011010110101011000110000111111010001111111111100100101000100010111100111101010" und vergesse nicht die Prüfsumme dazu zu zählen. Dann errechnet man aus den Folgenden 4 Bytes den Offset zum nächsten Sektor. Dort erhält man dann die Liste mit den Dateien, die aber natürlich verlinkt in einem anderen Sektor (oder Cluster) weitergehen. Hat man dies, so kann man das ganze dann rekursiv abarbeiten.
Ja,ja, schon gut. Ich habe von deiner Abneigung gegen WinForms Anwendungen schon gelesen. Aber was wäre denn dein ernstgemeinter Vorschlag für das Problem?
-
Was für eine Lösung suchst Du denn bitte?
Alles ist doch schon von [Rewind] gesagt und alles was Du hier mit C++/CLI machst geht nativ genauso....
-
lazer schrieb:
Aber was wäre denn dein ernstgemeinter Vorschlag für das Problem?
Warum nicht einfach ein Konsolenprogramm mit der Abfrage, ob ein Ordner oder ein File verarbeitet werden soll, und dann dementsprechend GetOpenFileName bzw. SHBrowseForFolder aufrufen ...
-
Tja, sry... hab ich wohl ein bißchen zu schnell drüber hinwegelesen.