Autor Beitrag
Robii
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: Sa 27.03.10 22:42 
Guten Abend,

nachdem ich das eine Thema nun endlich beendet habe, hier gleich ein neues, hoffentlich kürzeres Thema.
Mit dieser Procedure:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.ComputerListing;
var
  wStr: WideString;
  pwStr: PWideChar;
begin
  wStr := '/C tree  C:\ > '+GetCurrentDir+'\tree.txt';
  ShowMessage(wStr);
  pwStr := PWideChar(wStr);
  Shellexecute(Handle, 'open''cmd.exe', pwStr, nil, SW_SHOWNORMAL);
end;

Versuche ich denn Tree Befehl der Konsole auszuführen und das Ergebnis im gleichen Ordner wie meine *.exe unter TREE.txt zu speichern.

Rufe ich diese Procedure im Programm auf, geht kurz ein Konsolen-Fenster auf. Ich bin mir nicht 100% sicher aber ich denke das im Fenster steht:'Datei nicht gefunden'.

Wieso das nicht? Muss ich die *.txt erst erstellen oder was mache ich falsch?

Ich hoffe ihr könnt mir helfen.
Lieben Gruß,
robii.


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am So 28.03.2010 um 01:54
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 27.03.10 22:59 
Da du Die Ausgabe eines externen Befehls capturen willst, empfiehlt sich eher die Nutzung von TDosCommand (oder wie diese externe Komponente hieß). Gibt's hier im Forum einiges dazu; auch in Bezug auf die Nutzung.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Robii Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: Sa 27.03.10 23:24 
Ich hatte das schonmal mit der von mir geposteten Procedure verwendet, allerdings ist die UNIT abhanden gekommen. N ur sehr ungerne würde ich jetzt eine neue Komponente benutzen. Weiß niemand wie es richtig heißen müsste in meinem Quelltext (s.o.)?

Lieben Gruß,
robii.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 28.03.10 00:18 
Moin!

Soll das was in dieser Art werden? Ich würde dann lieber auf die API-Funktionen setzen, um das Dateisystem zu lesen, statt da an der Konsole rumzulutschen. :nixweiss:

Wenn du das aber trotzdem machen musst/willst, dann schau mal hier, damit solltest du weiter kommen.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Robii Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: So 28.03.10 00:44 
Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Hey Narses, vom Prinzip her hast du Recht so etwas in der Richtung soll es werden, allerdings hatte ich das schon einmal mit einem TTreeView gemacht und das finde ich von der Übersichtlichkeit etwas schöner als deine Lösung *sorry*.

Allerdings scheitert es bei mir ja schon daran den Tree zu erstellen dein Link dazu verstehe ich nicht so ganz, weil die Procedure die dort gezeigt wird, hat ja keinen Ausgabewert, wenn ich das richtig gelesen habe.

Woran könnte denn bei meinem Quelltext liegen?

Lieben Gruß,
Robii.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 28.03.10 01:32 
Moin!

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
vom Prinzip her hast du Recht so etwas in der Richtung soll es werden, allerdings hatte ich das schon einmal mit einem TTreeView gemacht und das finde ich von der Übersichtlichkeit etwas schöner als deine Lösung *sorry*.
Was hat denn die GUI mit der Technik des Dateisystemzugriffs zu tun? :gruebel: Bei deinem Ansatz musst du die Ausgabe des Kommandozeilentools zerlegen, das dürfte doch wohl deutlich schwerer sein, als direkt die Daten vernünftig einzulesen. :nixweiss:

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Allerdings scheitert es bei mir ja schon daran den Tree zu erstellen dein Link dazu verstehe ich nicht so ganz, weil die Procedure die dort gezeigt wird, hat ja keinen Ausgabewert, wenn ich das richtig gelesen habe.
Hast du denn mal das Demo-Prog gestartet und deinen Befehl getestet? Bei mir liefert er brav die Ausgabe im Memo ab. ;)

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Woran könnte denn bei meinem Quelltext liegen?
Ich hab´s mir nicht genau angesehen, ich würd´s ja so nicht machen. :D

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.03.10 11:00 
user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Versuche ich denn Tree Befehl der Konsole auszuführen und das Ergebnis im gleichen Ordner wie meine *.exe unter TREE.txt zu speichern.
Was hat denn GetCurrentDir mit dem Verzeichnis deiner Exe zu tun?
Wenn du es dort speichern willst, solltest du das auch so schreiben. Allerdings hast du da normalerweise keine Schreibrechte.

Dir fehlen vermutlich Anführungszeichen, denn sonst ist beim ersten Leerzeichen im Pfad für den Datennamen Schluss und dann lässt sich das natürlich nicht speichern.

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Hey Narses, vom Prinzip her hast du Recht so etwas in der Richtung soll es werden, allerdings hatte ich das schon einmal mit einem TTreeView gemacht und das finde ich von der Übersichtlichkeit etwas schöner als deine Lösung
Was hat denn eine TreeView damit zu tun? Du willst doch wohl nicht im Ernst zuerst sämtliche Verzeichnisse durchsuchen, was ja sehr lange dauert, und dann das alles anzeigen? :shock:

Es reicht doch immer die aktuelle Ebene auszulesen, das geht blitzschnell. Beim Aufklappen eines Verzeichnisses kannst du dann die jeweiligen Unterverzeichnisse füllen.
Robii Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: Mo 29.03.10 23:59 
Sinn und Zweck des ganzen ist es, das ich nachher in einem TreeView den kompletten Inhalt der Festplatte C:\ habe. Aber wie du es vorgeschlagen hast, user profile iconjaenicke ist das natülich auch eine gute Idee.

Folgende Idee habe ich dann:
1) Alle verfügbaren Festplatten werden dargestellt
2) Eine Festplatte wird angeklickt, alle in der Festplatte enthaltenen Daten (C:\*.*) und alle Directorys die direkt in C:\ liegen werden aufgelistet.
3) Ein Directory wird angewählt, alle Daten & Directorys in dem Gewählten werden angezeigt.

Allerdings möchte ich das ganze ja mit SERVER & CLIENT machen, fällt dann nicht ein bisschen viel Traffic an oder ist das nicht schlimm?

Frage:
Wie finde ich herraus ob & welches Directory im TREEVIEW angeklickt worden ist?

Lieben Gruß,
robii.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 30.03.10 00:04 
Moin!

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Allerdings möchte ich das ganze ja mit SERVER & CLIENT machen, fällt dann nicht ein bisschen viel Traffic an oder ist das nicht schlimm?
Ob das schlimm ist, wieviele Daten übertragen werden oder nicht, ist doch nicht die Frage. Wenn du das Dateisystem remote untersuchen willst, wirst du früher oder später eh diese Daten übertragen müssen, wie willst du sonst den Inhalt sehen. :nixweiss:

Wenn du aber nur auf Anforderung (=Klick) ein Verzeichnis einliest wird die Datenmenge auf das nötige Minimum reduziert und insgesamt wird es sich etwas flinker bedienen lassen, weil nicht so viele Daten auf einmal transportiert werden müssen. :idea:

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Frage:
Wie finde ich herraus ob & welches Directory im TREEVIEW angeklickt worden ist?
Wie man ein TreeView benutzt klärst du bitte in einem neuen Thread in der VCL-Sparte. Danke. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: Di 30.03.10 05:19 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Allerdings möchte ich das ganze ja mit SERVER & CLIENT machen, fällt dann nicht ein bisschen viel Traffic an oder ist das nicht schlimm?
Ob das schlimm ist, wieviele Daten übertragen werden oder nicht, ist doch nicht die Frage. Wenn du das Dateisystem remote untersuchen willst, wirst du früher oder später eh diese Daten übertragen müssen, wie willst du sonst den Inhalt sehen. :nixweiss:

Wenn du aber nur auf Anforderung (=Klick) ein Verzeichnis einliest wird die Datenmenge auf das nötige Minimum reduziert und insgesamt wird es sich etwas flinker bedienen lassen, weil nicht so viele Daten auf einmal transportiert werden müssen. :idea:

Kommt drauf an, wann die Daten uebertragen bzw. ermittelt werden. Wenn sie serverseitig einmalig (oder in regelmaessigen Abstaenden) ermittelt werden, bevor eine Anforderung kommt, faellt schonmal die Wartezeit zum Erstellen weg. Und wenn man sie bei der ersten Anforderung auf einmal uebertraegt und auf dem Client cached, ist zwar diese erste Anforderung recht langsam, alles weitere aber sehr schnell.
Es kommt halt drauf an, wie der typische Zugriff aussieht:
* Wenn man immer aktuelle Daten braucht, aber nur fuer wenige Verzeichnisse, muss man sie auf Anforderung erstellen. -> Definitiv sollte man dafuer nicht tree verwenden, das dauert zu lange.
* Wenn man es auf Aktualitaet nicht ankommt, z.B. weil sich die Struktur nicht so haeufig aendert, und man auf viele Verzeichnisse zugreifen will, kann man mit Caching arbeiten um die Performance zu verbessern
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.03.10 07:10 
user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Allerdings möchte ich das ganze ja mit SERVER & CLIENT machen, fällt dann nicht ein bisschen viel Traffic an oder ist das nicht schlimm?
Dafür rate ich zu einem asynchronen Ansatz mit Übertragung jeweils der nächsten Ebene im Voraus. Das heißt am Anfang werden die Laufwerke angezeigt, aber bereits die Verzeichnisse auf jedem Laufwerk mit eingetragen. So sind diese sofort da, wenn jemand drauf klickt, die nächste Ebene kommt dann vom Server und wird dann eingetragen.

Auf diese Weise geht das schnell und trotzdem ohne große Wartezeiten. Je nach Verbindung kannst du auch eine weitere Ebene vorab mit einlesen und übertragen, ggf. in einem zweiten Datenpaket um die Antwortzeiten zu verkürzen.

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Wie finde ich herraus ob & welches Directory im TREEVIEW angeklickt worden ist?
Wie Narses schon sagte gehört das nicht hier rein, aber kleiner Hinweis: Schau mal in die Library :idea:, vielleicht brauchst du dann schon keinen neuen Thread. :zwinker:
Robii Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: Di 30.03.10 20:28 
So klappts übrigens mit dem Code nach dem ich oben anfangs gefragt hatte:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  wStr: WideString;
  pwStr: PWideChar;
begin
  wStr := '/C tree  C:\ > "'+ExtractFilePath(Application.ExeName)+'tree.txt"';
  ShowMessage(wStr);
  pwStr := PWideChar(wStr);
  Shellexecute(Handle, 'open''cmd.exe', pwStr, nil, SW_SHOWNORMAL);


Lieben Gruß,
robii.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 30.03.10 22:28 
Du willst das doch jetzt nicht im Ernst damit machen?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.03.10 23:16 
Vielleicht haben die Benutzer der Software ja zu viel Zeit, so dass die extreme Wartezeit günstig ist.

Und wenn es zudem noch Spaß macht die Datei dann korrekt zu parsen...
Robii Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236



BeitragVerfasst: Di 30.03.10 23:31 
Ich lade jetzt beim Start des Programms für jede vorhandene Festplatte einen kompletten Tree, speicher diesen in einer .txt und schicke diese als Stream an den Server. So habe ich immer zum Programm-Start ein aktuellen Tree, das reicht völlig. Und für mich einfacher im coden als beim Aufruf eines Verzeichnisses erstmal alle Unterverzeichnisse usw. zu transportieren.

Lieben Gruß,
robii.