2010-04-02 6 views
0

저장 및 스트림 객체를 열 수있는 COM 구조화 된 저장소 파일 판독기가 있습니다. 모두 만족합니다. 하지만 이제 한 아카이브에서 다른 아카이브로 사물을 복사하고 사물의 이름을 바꾼 다음 사물을 다시 디스크에 쓸 수 있기를 원합니다. 심지어 디스크에 변경 사항을 기록 할 수 없기 때문에 복사 및 이름 바꾸기 작업을 좋아하지도 않았습니다. 루트 IStorage 개체의 커밋 메서드를 호출하여 시도하고 잘 실행되는 것, 보이지만 변경 내용을 참조하십시오. 나는 이것을 C# .NET의 PInvoke를 통해 구현하고있다. 변경변경된 COM 구조적 저장소 파일을 디스크에 쓰는 방법은 무엇입니까?

 ListArchive((archive.Root as StructuredStorageContainer), 0); 
     archive.Root.Name = "Fail"; 
     archive.Save(); 

에게 StructuredStorageNode 클래스에 이름 정의를 만들기

public void Load(string path) 
    { 
     STATSTG[] storageElementInfos = new STATSTG[1]; 
     // Populate our storage object 
     var result = StgOpenStorage(path, null, STGM.DIRECT | STGM.READWRITE | STGM.SHARE_EXCLUSIVE, IntPtr.Zero, 0, out archive); 
     // Only proceed if we succeed in populating our SS object 
     if (result == 0) 
     { 
      uint count; 
      IEnumSTATSTG elements; 
      archive.EnumElements(0, IntPtr.Zero, 0, out elements); 
      elements.Next(1, storageElementInfos, out count); 
      if (count != 0) 
      { 
       if ((STGTY)storageElementInfos[0].type == STGTY.STGTY_STORAGE) 
       { 
        //create Root Here 
        var root = storageElementInfos[0]; 
        Root = new StructuredStorageContainer(); 
        Root.element = root; 
        (Root as StructuredStorageContainer).Load(archive); 
       } 
      } 
     } 

    } 

public void Save() 
    { 
     if (Root is StructuredStorageContainer) 
     { 
      (Root as StructuredStorageContainer).Save(); 
     } 
     archive.Commit(0); 
    } 

: 여기에 해당하는 코드 요소입니다.

internal System.Runtime.InteropServices.ComTypes.STATSTG element; 
    public string Name 
    { 
     get 
     { 
      return element.pwcsName; 
     } 
     set 
     { 
      element.pwcsName = value; 
     } 
    } 

답변

2

P/호출 프로젝트의 설계 요청하는 경우 나도 몰라하지만 그렇지 않은 그리고 만약 당신이/당신이 읽고 내 무료 및 오픈 소스 라이브러리에 대한 시도를 줄 수있는 빠른 솔루션이 필요합니다 구조화 된 저장소 파일 작성 OpenMCDF.

P/Invoke는 100 % C# .net 구현을 사용하지 않습니다.

관련 문제