Mahlzeit! vfat kann ich mit "-t msdos" mounten, dann sehe ich nur klein geschriebene 8.3 Namen. Wenn zwecks Datenaustausch mit Windows die Dateinamen fest vereinbart sind, reicht 8.3 leicht. Windows-Benutzer dürfen gerne BeiSpiel.Txt schreiben, mein Programm muss nur nach beispiel.txt suchen. Gibt es einen ähnlichen Luxus auch für exFAT? Also ohne solche Monster wie Qt oder GTK?
Bauform B. schrieb: > Gibt es einen ähnlichen Luxus auch für exFAT? Ich fürchte: nein, denn VFAT (FAT32) ist ein Balkon an FAT und damit in beide Richtungen kompatibel. ExFAT ist hingegen ein anderes Dateisystem.
Bauform B. schrieb: > Windows-Benutzer > dürfen gerne BeiSpiel.Txt schreiben, mein Programm muss nur nach > beispiel.txt suchen. Die Erfahrung lehrt, dass selbst das nicht reibungslos klappt.
Bauform B. schrieb: > Wenn zwecks Datenaustausch mit Windows die > Dateinamen fest vereinbart sind, reicht 8.3 leicht. Dann sind sie fest vereinbart. > Windows-Benutzer dürfen gerne BeiSpiel.Txt schreiben, Damit verletzen sie aber i.A. eben diese Vereinbarung. > mein Programm muss nur nach beispiel.txt suchen. Wenn das der fest vereinbarte Name ist, dann brauchst Du sowieso nur danach suchen und nicht versuchen für Windows eine Extrawurst zu braten. Bauform B. schrieb: > vfat kann ich mit "-t msdos" mounten, dann sehe ich nur klein > geschriebene 8.3 Namen. Soweit ich mich erinnere, speichern FAT-FS-Abkömmlinge die 8.3 Namensform zusätzlich zu den eigentlichen Dateinamen ab; schließlich ist das Mapping bei längeren Namen (zwangsläufig) nicht eindeutig und kann auch nicht unbedingt aus dem aktuellen Verzeichnisinhalt (sofern Files gelöscht wurden) rekonstruiert werden. > Gibt es einen ähnlichen Luxus auch für exFAT? Falls exFAT die 8.3 Form nicht ebenfalls zusätzlich speichert, kann es das nicht geben.
Michi S. schrieb: > Falls exFAT die 8.3 Form nicht ebenfalls zusätzlich speichert, kann es > das nicht geben. Doch, der Dateisystemtreiber könnte (per Option) alles nach Kleinbuchstaben wandeln, auch ganz ohne 8.3-Extrawurst. Macht er ja im Windows auch innerhalb des OS – die Dateisysteme selbst erhalten die Groß-/Kleinschreibung, aber die Systemaufrufe ignorieren sie. Hat er aber standardmäßig nicht implementiert:
1 | FILE SYSTEM OPTIONS |
2 | umask=value |
3 | Set the umask (the bitmask of the permissions that |
4 | are not present, in octal). The default is 0. |
5 | |
6 | dmask=value |
7 | Set the umask for directories only. |
8 | |
9 | fmask=value |
10 | Set the umask for files only. |
11 | |
12 | uid=n Set the owner for all files and directories. The |
13 | default is the owner of the current process. |
14 | |
15 | gid=n Set the group for all files and directories. The |
16 | default is the group of the current process. |
17 | |
18 | ro Mount the file system in read only mode. |
19 | |
20 | noatime |
21 | Do not update access time when file is read. |
Allerdings ist exfat auf Linux (und *BSD) ein fusefs (userland filesystem), es sollte also bei Bedarf kein allzugroßes Problem sein, sich den Quellcode zu schnappen und dieses Feature einzubauen. Wenn es halbwegs sauber implementiert ist, kann man das sicher sogar noch irgendwo upstream als Feature Request dann einreichen.
Bauform B. schrieb: > Windows-Benutzer > dürfen gerne BeiSpiel.Txt schreiben, mein Programm muss nur nach > beispiel.txt suchen. Genau das macht das exFat-Dateisystem unter Linux doch schon. Wenn du den Dateinamen kennst, ist Groß/Kleinschreibung egal. Wenn du Globs auflösen willst, nicht.
1 | # mount |grep loop |
2 | /dev/loop0 on /mnt type exfat (rw,relatime,fmask=0022,dmask=0022,iocharset=utf8,errors=remount-ro) |
3 | # echo "Hallo Welt">BeiSpieL.tXt |
4 | # cat beispiel.txt |
5 | Hallo Welt |
6 | # ls Bei* |
7 | Beispiel BeiSpieL.tXt |
8 | # ls bei* |
9 | ls: Zugriff auf 'bei*' nicht möglich: Datei oder Verzeichnis nicht gefunden |
Michi S. schrieb: >> Windows-Benutzer dürfen gerne BeiSpiel.Txt schreiben, > > Damit verletzen sie aber i.A. eben diese Vereinbarung. Diese Erkenntnis bringt einem nur nichts, wenn die Anwender sich regelmäßig nicht daran halten. Man kann dann nur entweder versuchen, die Nutzer dazu zu erziehen, es richtig zu machen, was im Prinzip zum Scheitern verurteilt ist, oder es jedes mal von Hand korrigieren. Oder man schaut eben, dass es auch mit den fehlerhaften Namen so weit wie möglich geht. > Bauform B. schrieb: >> vfat kann ich mit "-t msdos" mounten, dann sehe ich nur klein >> geschriebene 8.3 Namen. > > Soweit ich mich erinnere, speichern FAT-FS-Abkömmlinge die 8.3 > Namensform zusätzlich zu den eigentlichen Dateinamen ab; Genau genommen sind die 8.3-Namen die eigentlichen Dateinamen, und die langen Namen werden zusätzlich dazu abgespeichert.
Rolf M. schrieb: > Diese Erkenntnis bringt einem nur nichts, wenn die Anwender sich > regelmäßig nicht daran halten. Ich verstehe das Problem nicht. Εrnst B. schrieb: > Wenn du den Dateinamen kennst, ist Groß/Kleinschreibung egal.
Jörg W. schrieb: > Michi S. schrieb: >> Falls exFAT die 8.3 Form nicht ebenfalls zusätzlich speichert, kann es >> das nicht geben. > > Doch, der Dateisystemtreiber könnte (per Option) alles nach > Kleinbuchstaben wandeln, auch ganz ohne 8.3-Extrawurst. Macht er ja im > Windows auch innerhalb des OS – die Dateisysteme selbst erhalten die > Groß-/Kleinschreibung, aber die Systemaufrufe ignorieren sie. Εrnst B. schrieb: > Genau das macht das exFat-Dateisystem unter Linux doch schon. > Wenn du den Dateinamen kennst, ist Groß/Kleinschreibung egal. > Wenn du Globs auflösen willst, nicht. Ja, das macht exfat.ko im Prinzip genauso, vielen Dank. Wegen der Ausgabe von ls hatte ich schreckliches befürchtet, aber ein open("beispiel.txt", O_WRONLY) überschreibt brav auch Beispiel.TXT -- das ist erstmal etwas überraschend, wenn man das zum ersten Mal im Leben erlebt. Meistens funktioniert es anscheinend, unpraktisch ist es trotzdem, z.b. darf man bei locate das -i nicht vergessen. Jedenfalls ist es noch ein Fall, wo die schlechtere Technik gewonnen hat. Alexander schrieb: > Ich verstehe das Problem nicht. Hätte ich nie ein ls gemacht, hätte ich vielleicht nie gemerkt, das es ein Problem gibt ;)
Beitrag #7617975 wurde vom Autor gelöscht.
Bauform B. schrieb: > mein Programm muss nur nach > beispiel.txt suchen. Wenn casesensitive nicht erwünscht ist, dann würde ich im Programm den vom Dateisystem eingelesenen Filenamen etweder in Klein- oder Großbuchstaben umwandeln und mit dem gegewünschten Suchmuster vergleichen. In Pascal gibt es für so etwas die Funktionen lowercase() un un uppercase() und ich würde z.B. einfach schreiben:
1 | if lowercase(FName) = 'beispiel.txt' |
2 | then begin |
3 | do something ... |
4 | end |
FName ist der aus dem Filesystem ausgelesene Dateiname. Für C sind mir derartige Funktionen nicht bekannt, da muß man wohl selbst Hand ananlegen und sich was Eigenes schreiben. Ein Lösungsansatz wäre hier https://stackoverflow.com/questions/5820810/case-insensitive-string-comparison-in-c beschrieben. Ich würde mich auch nicht darauf verlassen, das es, wie von Ernst vorgeschlagen, der Dateisystemtreiber unter Linux schon richten wird. Das ist eine Stelle wo man einfach selber Hand anlegen muß - gute 25 Jahre Erfahrung mit einem Programm , welches in der Firma weltweit benutzt wird.
:
Bearbeitet durch User
Hans schrieb: > Bauform B. schrieb: >> mein Programm muss nur nach >> beispiel.txt suchen. > Wenn casesensitive nicht erwünscht ist, dann würde ich im Programm den > vom Dateisystem eingelesenen Filenamen etweder in Klein- oder > Großbuchstaben umwandeln und mit dem gegewünschten Suchmuster > vergleichen. Was verstehst du unter "vom Dateisystem eingelesenen Filenamen"? Normalerweise sagt man sowas wie "öffne beispiel.txt", und dann wird eben vom System nach einer Datei mit dem Namen gesucht und diese geöffnet. Man kann höchstens das einfache Öffnen dann durch eine Funktion ersetzen, die sich erst mal eine Liste aller Dateien im Verzeichnis holt und dann halt jeden Namen einzeln selbst vergleicht.
Rolf M. schrieb: > Was verstehst du unter "vom Dateisystem eingelesenen Filenamen"? > Normalerweise sagt man sowas wie "öffne beispiel.txt" Ich habe es so verstanden, das er im Dateisystem nach einer bestimmten Datei sucht, mit der er dann irgendetwas machen möchte, z.B. auch Öffnen, es kann aber auch was ganz anderes sein - er schreibt nach einer Datei suchen. Das kann man ja auf verschiedene Art und Weise tun und es hängt auch von der Programmiersprache ab wie man das macht. Letztendlich läuft es auf ein Auslesen der Dateitabelle (in diesem Sinne ein Einlesen der Dateitabelle ins Programm) hinaus. Sinnigerweise schreibt man die Dateifunde in eine Liste und itteriert über diese Liste. Wenn das Gewünschte dabei ist kann man dann entscheiden was man damit tut.
Hans schrieb: > Sinnigerweise schreibt man die Dateifunde in eine Liste und itteriert > über diese Liste. Sinnvollerweise nutzt man Regex. und das -i flag.
Alexander schrieb: > Hans schrieb: >> Sinnigerweise schreibt man die Dateifunde in eine Liste und itteriert >> über diese Liste. > > Sinnvollerweise nutzt man Regex. und das -i flag. Na dann bring doch einfach mal ein Beispiel. Du bist einer von den Schlaubergern die alles besser wissen aber am Ende nichts auf die Reihe bekommen. Kenne ich noch aus der Firma, da war auch so ein Jungdynamischer, der meinte mein Programm ist nicht so gut man müsse das modern nachprogrammieren. Nachdem er sich 6 Jahre daran versucht hat, hat die Firma die Reißleine gezogen und das Programm eingestellt. Nachdem auch ein zweiter Versuch kläglich gescheitert ist, hat man sich halt entschlossen mit meinem Programm weiterzuarbeiten. Man arbeite heute noch damit, obwohl ich schon sein einiger Zeit im Ruhestand bin - so sehr viel habe icch da wohl nicht falsch gemacht, u.a. was das das Arbeiten mit Dateien angeht. Du bist mal wieder wie immer ahnungslos. Da Bauform B bisher nicht geschrieben hat wie er sein "Programm" umsetzt können wir hier nur mutmaßen. Ich habe einen möglichen Weg aufgezeigt. Bekanntlich führen viele Wege nach Rom.
Hans schrieb: > Na dann bring doch einfach mal ein Beispiel. Du hast ja auch keins bringen können, eben weil: > Da Bauform B bisher nicht geschrieben hat wie er sein "Programm" umsetzt > können wir hier nur mutmaßen. Warum erwartest du dann, dass andere Beispiele bringen? Reguläre Ausdrücke sind dafür in der Tat ein sinnvolles Instrument. Einzig wenn man auf die Standard-Shell als Sprache limitiert ist, expr(1) bietet zwar reguläre Ausdrücke, aber dort kann man kein "i"-Flag angeben.
Jörg W. schrieb: > Du hast ja auch keins bringen können, eben weil: Wäre kein Problem den hier Beitrag "Re: exFAT mit "-t msdos" mounten?" gezeigten Pascalcodeschnipsel um FindFirst() und FindNext() zu ergänzen und dann daraus eine vollständige Suche nach "beispiel.txt" zu machen. In anderen Programmiersprachen wird es natürlich anders formuliert - hatte ich aber auch geschrieben. Jörg W. schrieb: > Warum erwartest du dann, dass andere Beispiele bringen? Weil er einfach mal wieder die große Klappe hat. Jörg W. schrieb: > aber dort kann man kein "i"-Flag > angeben. Genau deswegen habe ich es so geschrieben, wie ich es geschrieben habe. In Javascript gibt es ein i-Flag, aber damit wird wohl Bauform B gerad nicht hantieren. Wenn man schon so was in den Raum wirft dann sollten es nicht nur Worthülsen sein die man mal irgendwo aufgeschnappt hat. Im genannten Javascript heißt die Klasse die das Flag versteht auch nicht Regex sondern RegExp und von der muß man erst mal eine Instanz erzeugen, damit man regular Expressions überhaupt verwenden kann.
Hans schrieb: > In Javascript gibt es ein i-Flag, aber damit wird wohl Bauform B gerad > nicht hantieren. Gibt's auch überall sonst, nur expr(1) hat das nicht. Das Flag ist schon recht lange Bestandteil auch der "basic regular expressions", wie sie beispielsweise von sed(1) verstanden werden. C, Python, Perl etc. haben es dementsprechend auch alle.
In meinem Programm funktioniert das ganz unten mit opendir() und readdir() und auf die Art bekomme ich die originalen Namen. Der Mehraufwand sieht jetzt ungefähr so aus
1 | char * |
2 | vfat2unix (const char *vfat) |
3 | {
|
4 | static char unix[32]; |
5 | unsigned u1; |
6 | |
7 | for (u1 = 0; *vfat; u1++, vfat++) { |
8 | if (u1 >= sizeof unix - 1) { |
9 | errno = ENAMETOOLONG; |
10 | return NULL; |
11 | }
|
12 | if (*vfat == '\0') { |
13 | unix[u1] = '\0'; |
14 | break; |
15 | }
|
16 | if (*vfat <= ' ' || *vfat >= 127 || strchr ("\"&*/:<>?\\|", *vfat)) { |
17 | errno = EILSEQ; |
18 | return NULL; |
19 | }
|
20 | if (*vfat >= 'A' && *vfat <= 'Z') { |
21 | unix[u1] = *vfat + 32; |
22 | } else { |
23 | unix[u1] = *vfat; |
24 | }
|
25 | }
|
26 | unix[u1] = '\0'; |
27 | return unix; |
28 | }
|
Davon abgesehen, dass etwas Kommentar schon nett wäre, zumindest grob einer für die Funktion im Ganzen: es ist nicht klar, warum du so einen unportablen Weg wählst, statt mittels <ctype.h> und Dingen wie isascii(), isupper() und tolower() zu arbeiten. Nicht nur, dass diese portabel sind, sie haben zugleich noch einen Autodokumentations-Effekt.
Die Funktionen aus <ctype.h> sind von der locale abhängig. Das ist nett, aber an dieser Stelle nicht zutreffend. Der Treiber macht ja schon aus UTF-16 irgendwas 8-bittiges (was eigentlich?). 7-Bit ASCII ought to be enough for anybody ;) Mit dem Autodokumentations-Effekt hast du natürlich Recht. Aber: baue ich z.B. für einen uC ein eigenes strcmp() damit jeder gleich sieht, was da passiert, ist es auch wieder nicht Recht. Nenne ich es my_strcmp() glaubt jeder, das macht was besonderes :(
Bauform B. schrieb: > Die Funktionen aus <ctype.h> sind von der locale abhängig. Nur, wenn du vorher ein setlocale() aufrufst. Default ist die "C"-locale.
Hans schrieb: > Du bist einer von den Schlaubergern die alles besser wissen aber am Ende > nichts auf die Reihe bekommen. Regular Expressions und caseinsensitive Dateisuche sind absolute Basics, und das -i flag ist jedem bekannt der schon mal grep sed oder find benutzt hat. Es tut mir ja Leid für Dich wenn das für Dich Neuland ist, aber was ich auf die Reihe bekomme kannst Du nicht beurteilen. Ich sehe hier wie gesagt kein Problem mit dem Dateisystem. Wenn Du freundlicherweise ein Problem beschreiben könntest, dann zeige ich Dir wie ich es lösen würde.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.