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 network location into its own subdirectory.
\\FOO\data
into C:\gather\Foo_data
\\BAR\manage\current
into C:\gather\bar\manage
And so on. The problem is in FileOperation.CopyItem
. It must be because the destination directory doesn't exist yet—IFileOperation
will create it during the copy, right? I used the technique from another question and changed Toub's FileOperation.CreateShellItem
to this:
private static ComReleaser<IShellItem> CreateShellItem( string path )
{
try
{
return new ComReleaser<IShellItem>( (IShellItem)SHCreateItemFromParsingName( path, null, ref _shellItemGuid ) );
}
catch ( FileNotFoundException )
{
IntPtr pidl = SHSimpleIDListFromPath( path );
IShellItem isi = (IShellItem)SHCreateItemFromIDList( pidl, ref _shellItemGuid );
Marshal.FreeCoTaskMem( pidl );
System.Diagnostics.Debug.WriteLine( "Shell item: " + isi.GetDisplayName( SIGDN.DesktopAbsoluteParsing ) );
return new ComReleaser<IShellItem>( isi );
}
}
I stuck the Debug.WriteLine
in there to check that it's working, and it seems to be working fine; it writes the path back out.
But IFileOperation.CopyItem
throws an ArgumentException
, and I can't figure out why. Am I not doing the "IShellItem
for a nonexistent file" correctly? I suspect I need to get SFGAO_FOLDER
in there, since I am trying to create an IShellItem
for a nonexistent directory, not file, but how?