Autor |
Beitrag |
galagher
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 18.11.16 18:49
Hallo!
Ich möchte per Code Ordner- und Dateinamen mit Anführungszeichen versehen, wobei jedoch Laufwerksbuchstaben, zB. C: und C:\ davon ausgenommen sind, ebenso alle Wörter, in denen kein :\ vorkommt.
Das wäre nicht so schwierig, aber da Windows Leerzeichen in Dateinamen erlaubt, weiss ich nicht, wie ich vorgehen soll: Wo hört ein Ordner- oder Dateiname auf?
Ganze Worte sind ja einfach aufzufinden, sie könnten aber Bestandteil eines Ordner-/Datenamens sein und dürfen natürlich dann nicht von Anführungszeichen umschlossen sein!
Beispiel:
Dieses:
C:\Windows my.txt y: C:\ C:\Program Files (x86)\InstallShield Installation Information
soll zu dem werden:
"C:\Windows" my.txt d: C:\ "C:\Program Files (x86)\InstallShield Installation Information"
Wenn ich bloss nach ganzen Worten suche, kommt natürlich das heraus: "C:\Program Files" "(x86)\InstallShield" "Installation Information"
Das ist dann kein Ordnername mehr, sondern Müll, den ich nicht verwenden kann!
Wie kann ich vorgehen?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 18.11.16 19:14
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 18.11.16 20:56
Frühlingsrolle hat folgendes geschrieben : | Ich erwähne es nur mal nebenbei, dass dieser Text zuvor gesplittet gehört, bevor man, so wie ich vorgeschlagen, dies in die Tat umsetzt. |
Genau das ist es ja: Wie? Wo hört was auf, was gehört noch zum Ordnernamen und was schon zum nächsten Teilstring?
Ich habe das jetzt erstmal so gemacht, dass ein Anrührungszeichen vor jedem zB. C: ( "C:) und nach jedem \, auf das ein Leerzeichen folgt, gesetzt wird. Funktioniert.
Mit Dateinamen, die ja nicht mit \ enden, ist das etwas komplizierter. Also dachte ich, suche von 1 bis Length(s), finde ein Leerzeichen, gehe von da bis zu einem Punkt . zurück und setzt an der Position des Leerzeichens-1 ein Anrührungszeichen. Zur Info: s ist der Orginalstring, s1 der veränderte:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| for i := 1 to Length(s) do begin if s1[i] = ' ' then begin for n := i downto 1 do if s1[n] = '.' then begin s1.Insert(i, '"'); break; end; end; end; |
Heraus kommt:
a: "C:\1.txt ""C:\Program "Files "(x86)\InstallShield "Installation "Information\xxx.xxx my.txt
Das ist nichts! Irgendwo in meinen beiden for's ist ein Fehler...
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 18.11.16 21:09
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Ralf Jansen
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 18.11.16 21:15
Zitat: | Dieses:
C:\Windows my.txt y: C:\ C:\Program Files (x86)\InstallShield Installation Information
soll zu dem werden:
"C:\Windows" my.txt d: C:\ "C:\Program Files (x86)\InstallShield Installation Information" |
Woher hast du das Wissen genommen das es ein "C:\Windows" Ordner war und eine my.txt Datei?
Es könnte genauso sein das es der "Windows my.txt" Ordner ist oder die "Windows my.txt" Datei beides ist gültig.
Ohne Zugriff auf das betreffende Dateisystem wo du das nachprüfen könntest hast du keine Chance das tatsächlich Richtige zu tun.
Entweder du definierst zusätzliche Einschränkungen (also weitergehende die die eigentlichen Fähigkeiten des Dateisystem einschränken) hast Zugriff auf das Dateisystem um die Möglichkeiten durchzuprobieren oder das Problem ist nicht lösbar.
|
|
galagher
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 18.11.16 21:29
Frühlingsrolle hat folgendes geschrieben : | ich muss jetzt "dinnieren", wie es die "feine Gesellschaft" von mir verlangt. |
Lass es dir schmecken!
Ralf Jansen hat folgendes geschrieben : | Woher hast du das Wissen genommen das es ein "C:\Windows" Ordner war und eine my.txt Datei?
Es könnte genauso sein das es der "Windows my.txt" Ordner ist oder die "Windows my.txt" Datei beides ist gültig. |
Die Ordner und Dateien können per Dateisuche gefunden oder manuell geschrieben werden!
[quote="[user]Ralf Jansen[/user]"(703905)] Zitat: | Ohne Zugriff auf das betreffende Dateisystem wo du das nachprüfen könntest hast du keine Chance das tatsächlich Richtige zu tun. |
Im Wesentlichen schon. Klar, mitdenken muss man selbst!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 18.11.16 22:24
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 18.11.16 22:42
Frühlingsrolle hat folgendes geschrieben : | Danke im Nachhinein. Wenn die Pfade mittels Suche/Dialog ermittelt werden, dann wärs ein Leichtes, vorn und hinten ein Anführungszeichen zu setzen. Ansonsten, sofern der Dateiname "my.txt" in einem Stück bleibt und keine weiteren Punkte oder Leerzeichen hinzukommen, könnte ich mir eine Lösung vorstellen. |
Das Ganze ist ein Befehlsinterpreter, und ich möchte automatisch Anführungszeichen um die Ordner- und Dateinamen setzen. Diese werden beim Drücken der Tab-Taste abhängig von der vorhandenen Eingabe in die Kommandozeile gesetzt. (zB. findet die Eingabe c:\win (dann Tab drücken) C:\Windows. Die Anführungszeichen sollen aber nicht immer da sein, sondern nur, wenn man dies explizit anfordert. Nur dann soll das Programm um diese Namen Anführungszeichen setzen!
ich bin auf dem richtigen Weg, nur manchmal wird das letzte Anführungszeichen nicht gesetzt. Muss noch herausfinden, warum das so ist.
Jedenfalls ist es mühsam!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 19.11.16 00:54
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 19.11.16 11:34
Frühlingsrolle hat folgendes geschrieben : | Einen gemeinsamen Nenner zwischen:
Quelltext 1:
| C:\Windows my.txt y: C:\ C:\Program Files (x86)\InstallShield Installation Information |
und
Quelltext 1:
| a: C:\1.txt C:\Program Files (x86)\InstallShield Installation Information\xxx.xxx my.txt |
finde ich nicht. |
Es gibt auch keinen, das können ganz verschiedene Strings sein. Das sind nur Beispiele! Wie gesagt, es gibt eine Einganezeile, die verschiedene Angaben enthalten kann. Meine Beispiele sind sicher Extreme, ich wollte nur sehen, ob das funktioniert.
Ich habe jetzt eine Lösung, die aber nicht optimal funktioniert. Ich verwende zunächst am Ende der einzelnen Teilstrings statt " ein anders Zeichen, das ich anschliessend in einigen Fällen aber wieder entfernen muss, zuletzt konvertiere ich alle verbliebenen dann in ". Ausserdem wird am Anfang des letzten Teilstring manchmal kein " gesetzt, abhängig von dem, was vorher kam.
Ich teste noch eine Weile, ggf. stelle ich dann hier mal rein, was ich an Code habe.
Das Problem ist, auf einen Nenner gebracht: Es gibt kein einheitliches Format. Datei- und Ordnernamen können sonstwas sein!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
ub60
Beiträge: 762
Erhaltene Danke: 127
|
Verfasst: Sa 19.11.16 11:45
Hilft das hier www.entwickler-ecke....Ordner+_72184,0.html eventuell weiter oder hast Du nur die Befehlszeilen ohne Zugriff auf das Dateisystem?
ub60
Für diesen Beitrag haben gedankt: galagher
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 19.11.16 12:37
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2510
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: So 20.11.16 21:36
Ich habe Zugriff auf das Dateisystem, ich kann Datei- und Ordnernamen per Suche (Tab-Taste) einfügen oder einfach eintippen.
Frühlingsrolle hat folgendes geschrieben : | In dem Fall bringt es nichts, auf die Weise vorzugehen. Das einfachste was du jetzt machen könntest, wäre, weil die TAB-Taste ins Spiel gebracht wurde, beim Drücken der Taste, zwei Anführungszeichen auszugeben und mitten drin den Pfad zu hinterlegen. |
Ja, wäre eine Möglichkeit.
Ich habe mittlerweile eine Lösung gefunden, die zumindest so gut wie immer funktioniert, jedenfalls ist sie ausreichend. Bei ungerader Zahl an Anführungszeichen wird das letzte weggelassen (das wurde immer gesetzt), dann stimmt es zumindest von der Form her. Bleiben die Ordner-/Dateinamen, bei denen nicht klar ist, wo sie aufhören, dann setze ich eben keine Anführungszeichen.
Wo ein Dateiname anfängt und aufhört, erkenne ich am Punkt der Dateinamenserweiterung. Gut, es gibt auch Dateinamen ohne. Die werden dann eben wie Ordner behandelt. An dieser Stelle könnte ich natürlich noch prüfen, ob ein solcher Ordner existiert. Aber ich denke, so, wie es ist, reicht es!
Die Idde von Frühlingsrolle, zwei Anführungszeichen auszugeben und den Pfad dazwischen zu schreiben, ist jedenfalls bei der Tab-Taste eine Option!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Ralf Jansen
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 20.11.16 22:04
Zitat: | Gut, es gibt auch Dateinamen ohne. |
Und Ordner mit.
|
|
|