Creating directories during a copy using IFileOperation

前端 未结 1 559
遇见更好的自我
遇见更好的自我 2021-01-01 00:03

Using Stephen Toub\'s IFileOperation wrapper for C# (link), which has been working well until now. Now I am trying to do a copy to gather files from network locations, each

相关标签:
1条回答
  • 2021-01-01 00:37

    After a lot of Googling and coding experimentation this weekend (what a wild party weekend), I found a solution.

    1. Write a COM-compatible class that implements IFileSystemBindData.
    2. Allocate a WIN32_FIND_DATA structure and set its dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY. (The other members are irrelevant here, as far as I can tell after some testing.)
    3. Create an instance of your IFileSystemBindData class.
    4. Pass your WIN32_FIND_DATA object to IFileSystemBindData::SetFindData.
    5. Create an instance of IBindCtx.
    6. Call its IBindCtx::RegisterObjectParam with arguments of STR_FILE_SYS_BIND_DATA (#defined as L"File System Bind Data") and your IFileSystemBindData object.
    7. Call SHCreateItemFromParsingName with the pathname of the directory to create, and your IBindCtx object.

    It works. The binding-context object tells SHCreateItemFromParsingName not to query the filesystem, and just use what it's given. I got IFileOperation to copy a file into the new and cleverly-named directory D:\Some\Path\That\Did\Not\Previously\Exist, and it created all seven directories along the way. Presumably this same technique could be used to create an IShellItem for any non-existent filesystem object, depending on what you put in dwFileAttributes.

    But it's ugly. I hope there's a better way. My coding experimentation was in C++; now to write the COM interop stuff to do it again in C#. Or maybe it will be easier to throw out the project and start over in C++.

    0 讨论(0)
提交回复
热议问题