Announcement

Collapse
No announcement yet.

IStorage.CopyTo

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

  • IStorage.CopyTo

    Hallo,<br>
    ich möchte innerhalb einer SS-Datei einen neuen Storage ('Backup') anlegen<brund dann den RootStorage mit CopyTo in diesen Backup-Storage<brkopieren. Irgendwie funktioniert das aber nicht. Ich habe erst<br>an Rekursion gedacht, da der Backup-Storage ja seinerseits wieder<br>Bestandteil des Root-Storage ist. Aber dann habe ich eine neue<br>SS-Datei angelegt und wollte hier alles reinkopieren - das ging<br>genauso wenig. In der MSDN-Library steht :<br>
    The copy process is recursive, invoking IStorage::CopyTo and<br>IStream::CopyTo on the elements nested inside the source.<br

    Muss ich das jetzt selbst implementieren? Ich habe gedacht der IStorage<br>und der IStream könnten sich schon selbst kopieren.<br>
    <br>
    <br>
    Danke<br>
    Andy

  • #2
    Hallo,

    mit <b>CopyTo</b> kann der vollständige Inhalt (alle Storages und alle Streams) in eine andere Structured Storage-Datei kopiert werden:
    <pre>
    ...
    OleCheck(StgOpenStorage(PWideChar(sStorageFileName ), nil,
    STGM_READWRITE or STGM_SHARE_EXCLUSIVE or STGM_DIRECT,
    nil, 0, Storage));

    // Backup-Datei erzeugen
    sTmpFileName := GetTempDirFile('Backup_');
    OleCheck(StgCreateDocFile(PWideChar(sTmpFileName),
    STGM_CREATE or STGM_SHARE_EXCLUSIVE or
    STGM_DIRECT or STGM_READWRITE, 0, StorageTmp));
    // alles kopieren (entfragmentieren)
    Storage.CopyTo(0, nil, nil, StorageTmp);
    ...
    </pre>
    Allerdings wird das wohl nicht gehen, wenn der komplette Baum in eine Storage der gleichen Datei kopiert werden soll. Denn intern verwendet CopyTo vermutlich ein Enumerations-Objekt, so das auch das Backup-Verzeichnis mit kopiert wird ??? Warum wird das Backup nicht in einer separaten Datei angelegt

    Comment


    • #3
      Es handelt sich um eine Anwendung, welche ein Kollege von mir Programmiert hat.<br>
      Hier wird an diversen Stellen im Programm RootStorage.Commit(STGM_DIRECT)<br>
      aufgerufen. Da ich aber jetzt ein Backup-Konzept nachträglich <br>realisieren soll, wollte ich die Datei in sich selbst beim <br>Programm start kopieren - und nur bei Save dann diesen Teil in <br>eine Backup-Datei extrahieren.<br>

      Ihr Beispiel Herr Kosch hat mich darauf gebracht, das alles extern<br>
      gleich über eine Temp-Datei zu machen.<br>
      Trotzdem vielen Dank für die prompte Antwort.<br>
      <br>
      P.S. Ich bin froh das Sie mir mit Ihrer Antwort, wie fast immer, zu einer<br>Lösung verholfen haben

      Comment

      Working...
      X