In Dialogbox Ordner und Files auswählen?
-
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.