[Gelöst] WSH: Vor Ordner erstellen auf Schreibrechte prüfen

9. Mai 2011 16:38

Hallo zusammen,

Ich erstelle in einer Codeunit momentan einen Ordner mithilfe von 'Windows Script Host Object Model'.FileSystemObject:

Code:
IF ISCLEAR(WSH) THEN
  CREATE(WSH);

IF NOT WSH.FolderExists(CompletePath) THEN
  WSH.CreateFolder(CompletePath);


Das Blöde daran ist, dass es einen sehr kryptischen Fehler gibt ("Meldung für C/AL-Programmierer: Fehler in der Automation, keine Beschreibung des Fehlers hinterlegt" oder so ähnlich), der für einen User natürlich unbrauchbar ist, wenn ich versuche, den Ordner an einem Ort zu erstellen, an dem ich keine Schreibrechte habe, wie z.B. auf meinem DVD-Laufwerk "D:".
Ich würde gerne diesen Fehler abfangen und eine vernünftige Fehlermeldung ausgeben (etwa: 'Ordner %1 kann wegen fehlender Schreibrechte nicht erstellt werden.',CompletePath).

Weiß jemand wie das geht? CreateFolder gibt leider kein Boolean zurück und ich habe auch keinen anderen Befehl von 'Windows Script Host Object Model'.FileSystemObject gefunden, der auf einen Schreibrechte-Test hinweist.

Edit: eine extra CU dafür würde ich ungern anlegen (wie hier beschrieben).
Zuletzt geändert von InfoWissler am 11. Mai 2011 08:53, insgesamt 1-mal geändert.

Re: WSH: Vor Ordner erstellen auf Schreibrechte prüfen

9. Mai 2011 16:45

In der CU wo Du diese Zeilen Code her hast, einfach den OnRun Trigger in eine Funktion auslagern und dann dort die Prüfung machen wie in dem Link beschrieben. Damit hast Du die Codeunit.run möglichkeit plus keine weitere Codeunit. Wobei welcher Kunde kauft heute noch einzelnd Objekte ein? ;-)

Re: WSH: Vor Ordner erstellen auf Schreibrechte prüfen

10. Mai 2011 09:09

InfoWissler hat geschrieben:Edit: eine extra CU dafür würde ich ungern anlegen (wie hier beschrieben).

Jan hat schon recht, sowas sollte eigentlich kein Kriterium sein. Aber wenn es denn nun wirklich sein muß, dann kannst die Codeunit sich auch selbst aufrufen lassen.

Re: WSH: Vor Ordner erstellen auf Schreibrechte prüfen

10. Mai 2011 11:10

Vielen Dank, das werde ich mal versuchen. Eine neue CU ist mir nicht wg. des Preises für Kunden unlieb, sondern wg. schlechter Übersichtlichkeit bei so einem Vorgehen.

Re: WSH: Vor Ordner erstellen auf Schreibrechte prüfen

10. Mai 2011 16:35

Ich kriegs nicht hin, kann mir evtl. jemand ein einfaches Beispiel nennen?

Re: WSH: Vor Ordner erstellen auf Schreibrechte prüfen

10. Mai 2011 16:40

InfoWissler hat geschrieben:Ich kriegs nicht hin, kann mir evtl. jemand ein einfaches Beispiel nennen?


Du brauchst eine Codeunit. Diese braucht eine neue Funktion mit Parameter zur Aufnahme des Dateipfades, welcher in einer globalen Variable gespeichert wird.
Im OnRun-Trigger der CU wird nun ausgeführt:
Code:
WSH.CREATE(...);
WSH.CreateFolder(DeinPfadAusFunktion);


In deinem aufrufenden Quelltext erstellt du eine Variable auf deine neue Codeunit.
Die Codeunit rufst du dann so auf:
Code:
CLEAR(DeineCodeunitVar);
DeineCodeunitVar.DeineNeueFunktion(CompletePath);
IF NOT DeineCodeunitVar.RUN THEN
  ERROR('Du hast kein Schreibrecht!');

Re: WSH: Vor Ordner erstellen auf Schreibrechte prüfen

11. Mai 2011 08:42

Vielen Dank!

Habs jetzt in einer CU gelöst.

Der Code aus dem OnRun() habe ich in eine neue Funktion, Start(), ausgelagert:

Code:
GlobalPath := 'D:\Test\';
CreateFolder(GlobalPath);
...
...


Mein OnRun() sieht jetzt so aus:

Code:
IF ISCLEAR(WSH) THEN
  CREATE(WSH);

IF NOT WSH.FolderExists(StoredPath) THEN
    WSH.CreateFolder(StoredPath);


Mein CreateFolder() sieht so aus:
Code:
CLEAR(DieseCU);
DieseCU.StorePath(CompletePath);
IF NOT DieseCU.RUN THEN
  ERROR('Ordner %1 konnte nicht erstellt werden. Bitte Pfad prüfen (Schreibrechte vorhanden?)', CompletePath);


Neue Funktion StorePath:

Code:
StoredPath := CompletePath;



Umständlich ist das aber schon... :shock:


Muss ich eigentlich Clear(DieseCU) wirklich machen? Wenn ja, warum?

Re: WSH: Vor Ordner erstellen auf Schreibrechte prüfen

11. Mai 2011 09:01

InfoWissler hat geschrieben:Muss ich eigentlich Clear(DieseCU) wirklich machen? Wenn ja, warum?

CLEAR und CLEARALL bei Codeunits: Using Codeunits

Re: [Gelöst] WSH: Vor Ordner erstellen auf Schreibrechte prü

18. Mai 2011 14:29

"When you use the CLEAR function on a codeunit variable that has a reference to a codeunit instance with two or more references, CLEAR only deletes the reference to the codeunit and not the actual instance of the codeunit."

Warum sollte ich denn in meinem Beispiel die Referenz zur CU löschen?

Re: [Gelöst] WSH: Vor Ordner erstellen auf Schreibrechte prü

18. Mai 2011 15:25

Mußt du in deinem Fall nicht. Es ist doch eh ein einmaliger Aufruf, oder? Der User macht das doch per Kopfdruck, richtig? Sobald diese Verarbeitung dann durchgelaufen ist und wenn die erste Referenz über eine lokale Variable entsteht, dann sind eh beide Referenzen gelöst und die Instanz wird aufgelöst. Bei einer globalen Variable dann spätestens beim Schliessen der Form.

Re: [Gelöst] WSH: Vor Ordner erstellen auf Schreibrechte prü

18. Mai 2011 16:04

Achso, nein, die CU enthält noch mehr Code, in dessen Verlauf die Funktion "CreateFolder()" mehrmals aufgerufen wird. :oops:

Re: [Gelöst] WSH: Vor Ordner erstellen auf Schreibrechte prü

18. Mai 2011 16:42

Ok, aber dann bleibt die Instanz ja bestehen und damit auch die globalen Variablen. Das kann doch sogar ein Vorteil sein, denn die Instanz des (globalen?) Scripting Host muß nicht immer neu erstellt werden, ergo ist die Verarbeitung schneller.