[RTC] (Netzwerk) Ordner durchsuchen

5. Januar 2012 12:17

Hallo zusammen und ein frohes neues Jahr nochmal,

ich hab zwischen den Feiertagen nach einem Problem geschaut, welches ich lösen wollte und fand dabei einige Ideen, welche aber größtenteils nicht funktioniert, weil es der RTC ist oder dann auch zu langsam waren. Leider aber nicht ausreichende Informationen. Es geht um das Thema Ordner durchsuchen. Dabei wurden folgende Lösungsansätze bereits in betracht gezogen.

1. Die virtuelle Tabelle "File"
2. Die Automation Server WSH Objects

Zum Lösungsansatz 1.:
Die Idee ist gut, aber ich habe an mehreren stellen gelesen, dass es ein Prolem mit sehr tiefen Subordner gibt und das die Tabelle lt. Microsoft auch offiziell für den RTC einen Bug, welcher es nicht möglich macht dieses im RTC zu nutzen.

Zum Lösungsansatz 2.:
Das klappt soweit, dass ich einen Ordner auslesen kann. Wahlweise vom Server oder Client, je nach CREATE Befehl. Problematisch wird es, wenn man dann die Dateien als weiteres WSH Objekt bekommt, welches einen Index verlangt, an dann dran kommt, wenn man mit einem VB Script und einem weiteren WSH Objekt den Indexer auf auf ein Dictonary umstellt um dann daran zu kommen. Wobei hier im RTC zusätzlich noch eine VB Funktion deklariert werden muss, damit man dann auch den Indexer bekommt, weil der RTC die Konvertierung zwischen zwei Werten beim Assembly nicht hinbekommt :D Soweit klar?

Nun hab ich mir doch gedacht, da ich sowieso RTC machen möchte und kein CC nutze ich die DotNet Variablen. Und das war deutlich einfacher und hat auf anhieb geklappt und kann sogar auf Netzwerkordner zugreifen. Wobei es sich im diesem Beispiel um die Server handelt, auf den zugegriffen wird.

Hier ein Code Beispiel:
Code:
OBJECT Codeunit 50000 SearchDirectory
{
  OBJECT-PROPERTIES
  {
    Date=02.01.12;
    Time=12:00:00;
    Modified=No;
    Version List=iPeon 1.00;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            MyPath := 'C:\tmp\';

            DotNetDirectoryInfo := DotNetDirectoryInfo.DirectoryInfo(MyPath);
            IF NOT DotNetDirectoryInfo.Exists THEN
              ERROR(Text000, CONVERTSTR(MyPath, '\', '/'));

            DotNetArray := DotNetDirectoryInfo.GetFiles('*.txt');

            IF DotNetArray.Length > 0 THEN
              FOR i := 0 TO DotNetArray.Length - 1 DO BEGIN
                DotNetFileInfo := DotNetArray.GetValue(i);
                MyFile.TEXTMODE(TRUE);
                MyFile.WRITEMODE(FALSE);
                MyFile.OPEN(DotNetFileInfo.FullName());
                REPEAT
                  MyFile.READ(FileLine);
                  //Do something
                UNTIL MyFile.POS = MyFile.LEN;
                MyFile.CLOSE;

                MESSAGE(DotNetFileInfo.Name());
              END;
          END;

  }
  CODE
  {
    VAR
      MyPath@1000000000 : Text[1024];
      MyFile@1000000002 : File;
      FileLine@1000000007 : Text[1024];
      i@1000000013 : Integer;
      DotNetDirectoryInfo@1000000019 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.DirectoryInfo";
      DotNetFileInfo@1000000020 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.FileInfo";
      DotNetArray@1000000022 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
      Text000@1000000023 : TextConst 'DEU=Importordner %1 konnte nicht gefunden oder zugegriffen werden.;ENU=Importdirectory %1 couldn''t be find or accessed.';

    BEGIN
    END.
  }
}


Ich wünsche euch viel Erfolg beim ausprobieren. Vielleicht hilft es jemanden.

Mit freundlichen Grüßen iPeon