Announcement

Collapse
No announcement yet.

file exists Problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • file exists Problem

    Hi,

    erstmal der Code:
    Code:
    int  i = 1;
                  String  sSecretKey = "123456"; //natürlich ein anderer^^
                    GCHandle gch = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned);
    
                    string Pfad = System.Threading.Thread.GetDomain().BaseDirectory; // der Pfad des Verzeichnis in dem sich die Dateien befinden
                    DirectoryInfo di1 = new DirectoryInfo(Pfad);
                    FileInfo[] files_crypt = di1.GetFiles("*.crypt");
    
                    foreach (string file in System.IO.Directory.GetFiles(System.Threading.Thread.GetDomain().BaseDirectory, "*.xml", System.IO.SearchOption.TopDirectoryOnly))
                    {
    
                        if (!files_crypt[i].Exists)
                        {
                          EncryptFile(@file, @System.Threading.Thread.GetDomain().BaseDirectory + "xml" + i + ".crypt", sSecretKey);                        
    i++;
                        }
                        else
                        {
      
                           
                            i++;
                        }
    
                    }
           
    
                    ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2);
                    gch.Free();
    Jedenfalls wird seit dem ich die Fileexistsabfrage drin habe nicht mehr verschlüsselt. Dabei müsste es doch eigentlich funktionieren?
    Wenn die Datei xml1.crypt existiert wird sie nicht überschrieben....
    Aber es werden leider gar keine Dateien mehr verschlüsselt???
    Hoffe ihr könnt mir helfen.

  • #2
    Du initialisierst i mit 1. Arrays sind 0 basiert. Du verpasst also auf jeden Fall bei der Prüfung die erste Datei in files_crypt.

    Ansonsten, auch wenn das wenig Code ist und ich ihn nicht durchschaue, hat der einen strengen Geruch.

    - du scheinst einen Quell und einen Zieldateinamen zu haben im Aufruf von EncryptFile erzeugst du aber noch einen 3.ten Namen?
    - wenn du kein crypt File findest (files_crypt ist leer) wird der Code eine Exception werfen
    - ich vermute du willst abc.xml nach abc.crypt verschlüsseln(nur wenn crypt nicht existiert) vergleichst aber mit irgendeinem crypt File Namen den du im Zielordner gefunden hast?

    Comment


    • #3
      Also im Verzeichniss liegt z.B. die Datei data1.crypt und data2.xml
      data1.crypt wurde also nicht benutzt und muss demnach nicht neuerstellt werden, data2.xml aber schon.

      Comment


      • #4
        FileInfo[] files_crypt = di1.GetFiles("*.crypt");
        Du holst dir eine Liste mit *.crypt Dateien aus einem Verzeichnis. Soweit so gut.

        if (!files_crypt[i].Exists)
        Im folgenden prüfst du ob die Datei in diesem Verzeichnis nicht existiert. Wie soll die erst in files_crypt reingekommen sein wenn die gar nicht existiert? Die Abfrage sollte also immer false liefern. (Außer du hast parallel dazu einen Task/Thread der dir zwischen GetFiles und der Exists Abfrage die Datei löscht)


        Ansonsten wenn dein Beschreibung im letzten Post stimmt paßt dein Code nicht wirklich dazu. Ich formuliere mal eine Lösung in Prosa (ich glaube das hilft dir mehr als wenn ich fertigen Code zaubere)

        a.) hole alle XML-Dateien aus dem speziellen Verzeichnis (nicht wie bei dir crypt-Dateien)
        b.) iteriere über die FileInfos der XML Dateien (nicht crypt Dateien)
        c.) prüfe ob eine korrespondierende crypt Datei existiert (selber Name aber andere Extension)
        d.) wenn diese crypt Datei nicht existiert erzeuge sieh (den crypt Filenamen der erzeugt werden soll hast du in Schritt c. schon erzeugt, also hier wiederverwenden)
        e.) nächste Iteration gehe zu c.)


        String sSecretKey = "123456"; //natürlich ein anderer^^
        Wenn dein Schlüssel m SourceCode steht kannst du dir das nullen des speichers sparen. Kein Angreifer würde sich den Aufwand machen im Datensegment nach dem Schlüssel zu suchen wenn der im Klartext aus dem Codesegment geholt werden kann.

        Comment


        • #5
          Habe zwar verstanden was du meinst, probiere aber seit 40minuten es umzusetzen
          Meinen Denkfehler habe ich jedenfalls verstanden.

          Meine neue Idee:
          foreach (string file in System.IO.Directory.GetFiles(System.Threading.Thre ad.GetDomain().BaseDirectory, "*.xml", System.IO.SearchOption.TopDirectoryOnly))
          {
          if (File.Exists(System.Threading.Thread.GetDomain().B aseDirectory+"xml" + i + ".crypt"))
          {
          i++;
          }
          else
          {

          EncryptFile(@file, @System.Threading.Thread.GetDomain().BaseDirectory + "xml" + i + ".crypt", sSecretKey);
          }



          }
          Funktioniert aber auch nicht?
          Wenn die datei xmli.crypt existiert wird i erhöht. Wenn nicht wird es quasi erstellt?
          Du meinst aber das jetzt alle xml Dateien verglichen werden sollen oder wie?

          Comment


          • #6
            Im File.Exists gehört ein Slash zwischen Directory und Filename. Und wofür brauchst du i? Wenn im deinem foreach als file z.B. data2.xml gefunden wird dann prüfe einfach ob data2.crypt schon existiert. Ich sehe keinen Grund selbst nochmal durchzuzählen oder sich die 2 nochmal irgendwie sonst berechnen zu wollen.

            Code:
            string directory = Thread.GetDomain().BaseDirectory;
            foreach (string xmlFile in Directory.GetFiles(directory, "*.xml", SearchOption.TopDirectoryOnly))
            {
                cryptfile = Path.Combine(directory, Path.ChangeExtension(xmlFile, ".crypt")));
            
                if (!File.Exists(cryptfile))
                {
                    EncryptFile(xmlFile, cryptfile, sSecretKey);
                }
            }

            In welchem Verzeichnis möchtest du denn nach Dateien suchen? Der Weg über Thread.GetDomain().BaseDirectory ist eher ungewöhnlich.

            Comment


            • #7
              Die Dateien liegen im "Ausführungsverzeichniss".
              Aber danke schon mal, ich hatte einfach nur nen Logikfehler
              Die jetztige Lösung funktioniert!

              Comment

              Working...
              X