Mehrere Dateien einlesen
-
Hallo Leute,
länger nichts mehr gepostet, aber es gibt mich noch
Habe vor einiger Zeit ein kleines Programm zum Chiffrieren von Dateien geschrieben. Ist jetzt mit Sicherheit nicht der Wahnsinns Code, aber für meine Zwecke tut er es schon. (Hab auch nochmal nachgebessert, da VLA´s wirklich nicht der Hit waren, bzw. falsch waren => Gruß und Danke an WUTZ :-)) ).
Aber nun zum eigentlichen Thema:
Ich gebe in meinem Programm die Datei an, die Chiffriert werden soll , chiffriere und komme dann zurück in mein Hauptmenü. Das funktioniert soweit ziemlich gut, aber komfortabler wäre es natürlich wenn ich gleich alle Dateien im aktuellen Ordner nacheinander bearbeiten könnte.
Meine Frage nun, wie könnte ich das realisieren? Das Programm ist nur in der Konsole ausführbar, ich müsste irgendwie eine Liste mit allen Dateinamen im aktuellen Ordner ins Programm bekommen.....Jmd. eine Idee?
-
Mit Standard-C garnicht. Welches Betriebssystem?
-
F... ; Dachte ich mir schon fast.
Betriebssystem Win7 .
Ich hatte schon die Idee mit ner Batch Datei eine Liste zu erstellen und dann in einer Schleife x-mal mein Programm aufzurufen, und dem Programm über argv die Namen zu übergeben.... Aber das ist doch Mist hoch 3
-
-
Ok, da ist evtl. was dabei. Naja, mal sehen, das "riecht" nach einigem zum einlesen.
Allgemein: Wäre C# eine alternative, da man damit angeblich "schnell" in der Lage ist "Fenster" und "Anwender Applikationen" zu erstellen. ?
Am besten Wäre tatsächlich ein kleines Fenster, ich kann die Dateien auswählen, bzw. markieren , und dann bearbeitet mein Programm sie. Aber dann müsste ich , sollte das in C# "realativ" einfach sein, mein Programm auch ummodeln, was mich auch nicht sonderlich begeistert.
Sieht jmd. evtl. noch ne andere Alternative?
-
Du könntest dir auch eine Batch-Datei schreiben:
dir /b /-D | <dein_programm>
So brauchst du dann nur von der Standardeingabe die Dateien zeilenweise zu lesen.
Evtl. könntest du dann mit einem Parameter für dein Programm bestimmen, in welchem Modus er lesen soll, z.B. "/D" (für Dictionary)
dir /b /-D | <dein_programm> /D
Dann mittels 'argv' den Parameter auswerten und die Dateien bearbeiten.
Mit C# ein Formular erstellen und dann dein Programm aufrufen (z.B. mittels der Klasse Process) wäre aber natürlich auch möglich.
-
beginner88888 schrieb:
Ok, da ist evtl. was dabei. Naja, mal sehen, das "riecht" nach einigem zum einlesen.
Wo ist dein Problem?
#include <stdio.h> #include <windows.h> int main( void ) { WIN32_FIND_DATAA w32_find_data; HANDLE find_handle = FindFirstFileA( "*", &w32_find_data ); puts( w32_find_data.cFileName ); while( FindNextFileA( find_handle, &w32_find_data ) ) puts( w32_find_data.cFileName ); }
-
Swordfish schrieb:
beginner88888 schrieb:
Ok, da ist evtl. was dabei. Naja, mal sehen, das "riecht" nach einigem zum einlesen.
Wo ist dein Problem?
#include <stdio.h> #include <windows.h> int main( void ) { WIN32_FIND_DATAA w32_find_data; HANDLE find_handle = FindFirstFileA( "*", &w32_find_data ); puts( w32_find_data.cFileName ); while( FindNextFileA( find_handle, &w32_find_data ) ) puts( w32_find_data.cFileName ); }
Geht nicht in Unterordner rein.
-
Nathan schrieb:
Swordfish schrieb:
beginner88888 schrieb:
Ok, da ist evtl. was dabei. Naja, mal sehen, das "riecht" nach einigem zum einlesen.
Wo ist dein Problem?
#include <stdio.h> #include <windows.h> int main( void ) { WIN32_FIND_DATAA w32_find_data; HANDLE find_handle = FindFirstFileA( "*", &w32_find_data ); puts( w32_find_data.cFileName ); while( FindNextFileA( find_handle, &w32_find_data ) ) puts( w32_find_data.cFileName ); }
Geht nicht in Unterordner rein.
beginner88888 schrieb:
[...] ich müsste irgendwie eine Liste mit allen Dateinamen im aktuellen Ordner ins Programm bekommen.....
-
Swordfish schrieb:
Nathan schrieb:
Swordfish schrieb:
beginner88888 schrieb:
Ok, da ist evtl. was dabei. Naja, mal sehen, das "riecht" nach einigem zum einlesen.
Wo ist dein Problem?
#include <stdio.h> #include <windows.h> int main( void ) { WIN32_FIND_DATAA w32_find_data; HANDLE find_handle = FindFirstFileA( "*", &w32_find_data ); puts( w32_find_data.cFileName ); while( FindNextFileA( find_handle, &w32_find_data ) ) puts( w32_find_data.cFileName ); }
Geht nicht in Unterordner rein.
beginner88888 schrieb:
[...] ich müsste irgendwie eine Liste mit allen Dateinamen im aktuellen Ordner ins Programm bekommen.....
Oh. Ups. Sorry.
-
beginner88888 schrieb:
Ok, da ist evtl. was dabei. Naja, mal sehen, das "riecht" nach einigem zum einlesen.Wo ist dein Problem?
Habe nichts von Problem geschrieben. Habe noch nie mit Win Api gearbeitet, darum einlesen. Sonst sind die nächsten 25 Beiträge à la "Jetzt geht aber das nicht"... vorprogrammiert.
beginner88888 schrieb:
[...] ich müsste irgendwie eine Liste mit allen Dateinamen im aktuellen Ordner ins Programm bekommen.....Oh. Ups. Sorry.
=> Kein Problem. Hmm... Wer spricht aus Erfahrung, wie lange ungefähr bis man mit C# sowas auf die Reihe bekommt? Anm: Habe gehört in C# gibt es unsicheren Code, der dann auch Pointer zulässt. .... Könnte ich da evtl. "komplett" meinen bisherigen Code reinballern?
-
beginner88888 schrieb:
beginner88888 schrieb:
Ok, da ist evtl. was dabei. Naja, mal sehen, das "riecht" nach einigem zum einlesen.Wo ist dein Problem?
Habe nichts von Problem geschrieben. Habe noch nie mit Win Api gearbeitet, darum einlesen. Sonst sind die nächsten 25 Beiträge à la "Jetzt geht aber das nicht"... vorprogrammiert.
Swordfish hat dir schon alles gegeben, was du brauchst.
Du musst lediglich puts( w32_find_data.cFileName ) durch my_decode(w32_find_data.cFileName) ersetzen.beginner88888 schrieb:
[...] ich müsste irgendwie eine Liste mit allen Dateinamen im aktuellen Ordner ins Programm bekommen.....Oh. Ups. Sorry.
=> Kein Problem. Hmm... Wer spricht aus Erfahrung, wie lange ungefähr bis man mit C# sowas auf die Reihe bekommt? Anm: Habe gehört in C# gibt es unsicheren Code, der dann auch Pointer zulässt. .... Könnte ich da evtl. "komplett" meinen bisherigen Code reinballern?
Nein, C# ist nicht abwärtskompatibel mit C. C++ ist größtenteils, aber nicht C#.
Ich kenn mich jetzt selber nciht mit C# aus, aber du kannst wie Th69 schon schrieb, dein existierendes C Programm als ausführbare Datei von einem C# Programm aus aufrufen.
Aber wenn du C# noch nicht kennst musst du dich da erst einmal komplett reinarbeiten, inklusive OO-Denken und allem.
-
Swordfish hat dir schon alles gegeben, was du brauchst.
Du musst lediglich puts( w32_find_data.cFileName ) durch my_decode(w32_find_data.cFileName) ersetzen.Danke derweilen, ich versuche das mal so hinzubekommen. C# stell ich erst mal hinten an
-
Alter, die MSDN ist jetzt nicht wirklich mein Fall...
Kann ich das besser spezifizieren :
HANDLE find_handle = FindFirstFileA( "*", &w32_find_data );
Ich bräuchte alle Dateien ausser *.exe . ...
-
und Unterordner sollten auch nicht durchsucht werden....
-
Nimm doch einfach strcmp und vergleich den Dateinamen.
Oder such manuell mit strrchr (mit zwei r) nach '.' und check ob das danach gleich "exe" ist um alle exe Dateien auszuschließen.
Alternativ kannste auch einfach das Wildcard-Pattern "" durch ".txt" ersetzten um bspw. alle txt zu bekommen.Edit: Und was Unterordner angeht:
Check ob w32_find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY true ist, wenn ja, skip die Datei.
-
Oder such manuell mit strrchr (mit zwei r) nach '.' und check ob das danach gleich "exe" ist um alle exe Dateien auszuschließen.
Ich wollte das auf die "Faule" Art von find_handle erledigen lassen.
Das mit dem Wildcard Pattern funzt auch nicht so ganz. "*.txt" bezieht sich wohl nicht auf das aktuelle Verzeichnis? Und bei %CD% klappts auch nicht.
-
Nachtrag ".txt " funktioniert natürlich schon, war mein Fehler.
Es wäre hald etwas wie ".alles ausser txt" nett
-
beginner_offl schrieb:
Nachtrag ".txt " funktioniert natürlich schon, war mein Fehler.
Es wäre hald etwas wie ".alles ausser txt" nettJa, FindFirstFile unterstützt leider kein Regex.
FindFirstFileEx eventuell, werd allerdings aus der Doku auch nicht schlau.
-
Nathan schrieb:
FindFirstFileEx eventuell, werd allerdings aus der Doku auch nicht schlau.
Bei
FindFirstFileEx()
kann man sich aussuchen, ob einen 8.3 Namen interessieren (FINDEX_INFO_LEVELS
Enumeration), ob sich das Ding benehmen soll wieFindFirstFile()
oder nur Verzeichnisse berücksichtigen soll (FINDEX_SEARCH_OPS
Enumeration), ob es case-sensitive (FIND_FIRST_EX_CASE_SENSITIVE
) sein soll und/oder einen größeren Puffer für bessere Performance verwenden soll (FIND_FIRST_EX_LARGE_FETCH
). Hilft also alles nix.Für die Faulen:
#define _CRT_SECURE_NO_WARNINGS #include <stdbool.h> #include <stddef.h> #include <memory.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <windows.h> typedef char ** file_list_t; /* * false && !file_list -> error * true && !file_list -> no files found */ bool create_file_list_ex( file_list_t * file_list, char const ** exclude_list ) { char * extension; HANDLE find_handle; WIN32_FIND_DATAA find_data; size_t i; size_t file_list_size = 0; file_list_t temp_file_list; *file_list = NULL; if( ( find_handle = FindFirstFileA( "*", &find_data ) ) == INVALID_HANDLE_VALUE ) return GetLastError() == ERROR_FILE_NOT_FOUND; do { if( GetFileAttributesA( find_data.cFileName ) & FILE_ATTRIBUTE_DIRECTORY ) continue; if( exclude_list && ( extension = strrchr( find_data.cFileName, '.' ) ) ) { for( i = 0; exclude_list[ i ]; ++i ) if( stricmp( extension, exclude_list[ i ] ) == 0 ) break; if( exclude_list[ i ] ) continue; } temp_file_list = realloc( *file_list, ++file_list_size * sizeof *file_list ); if( !temp_file_list ) { while( file_list_size-- ) free( (*file_list)[ file_list_size ] ); free( *file_list ); *file_list = NULL; FindClose( find_handle ); return false; } *file_list = temp_file_list; (*file_list)[ file_list_size - 1 ] = malloc( strlen( find_data.cFileName ) + 1 ); // TODO: Error handling ... strcpy( (*file_list)[ file_list_size - 1 ], find_data.cFileName ); } while( FindNextFileA( find_handle, &find_data ) ); if( GetLastError() == ERROR_NO_MORE_FILES ) temp_file_list = realloc( *file_list, ++file_list_size * sizeof *file_list ); else temp_file_list = NULL; if( !temp_file_list ) { while( file_list_size-- ) free( (*file_list)[ file_list_size ] ); free( *file_list ); *file_list = NULL; FindClose( find_handle ); return false; } *file_list = temp_file_list; (*file_list)[ file_list_size - 1 ] = NULL; FindClose( find_handle ); return true; } bool create_file_list( file_list_t * file_list ) { return create_file_list_ex( file_list, NULL ); } void print_file_list( file_list_t file_list ) { size_t i; if( !file_list ) return; for( i = 0; file_list[ i ]; ++i ) puts( file_list[ i ] ); } void free_file_list( file_list_t file_list ) { size_t i; if( !file_list ) return; for( i = 0; file_list[ i ]; ++i ) free( file_list[ i ] ); free( file_list ); } int main( void ) { file_list_t file_list; char const * exclude_list[] = { ".c", ".h", NULL }; create_file_list_ex( &file_list, exclude_list ); print_file_list( file_list ); free_file_list( file_list ); }