Forum: PC-Programmierung exFAT mit "-t msdos" mounten?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Bauform B. (bauformb)


Lesenswert?

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?

von Steve van de Grens (roehrmond)


Lesenswert?

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.

von Wendels B. (wendelsberg)


Lesenswert?

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.

von Michi S. (mista_s)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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.

von Alexander (alecxs)


Lesenswert?

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.

von Bauform B. (bauformb)


Lesenswert?

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.
von Hans (ths23)


Lesenswert?

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
von Rolf M. (rmagnus)


Lesenswert?

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.

von Hans (ths23)


Lesenswert?

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.

von Alexander (alecxs)


Lesenswert?

Hans schrieb:
> Sinnigerweise schreibt man die Dateifunde in eine Liste  und itteriert
> über diese Liste.

Sinnvollerweise nutzt man Regex. und das -i flag.

von Hans (ths23)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Hans (ths23)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Bauform B. (bauformb)


Lesenswert?

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
}

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Bauform B. (bauformb)


Lesenswert?

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 :(

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Alexander (alecxs)


Lesenswert?

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
Noch kein Account? Hier anmelden.