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
After a lot of Googling and coding experimentation this weekend (what a wild party weekend), I found a solution.
IFileSystemBindData
.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.)IFileSystemBindData
class.WIN32_FIND_DATA
object to IFileSystemBindData::SetFindData
.IBindCtx
.IBindCtx::RegisterObjectParam
with arguments of STR_FILE_SYS_BIND_DATA
(#define
d as L"File System Bind Data"
) and your IFileSystemBindData
object.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++.