83744


COMインターフェースのIFileOperationを使っています。  
CopyItemsでファイルをコピーしようとしましたが、  
スマホ等のWPDのフォルダ内でファイルをコピー、貼付けしようとすると  
「予期しないエラーのため、ファイルをコピーできません。このエラーが再発する場合は、エラーコードを使用して、この問題についてのヘルプを検索してください。」  
「エラー0x800700AA：要求されたリソースは使用中です。」  
とメッセージが出てコピーできません。

WPDのSDカードから`C:\`、および`C:\`からWPDのSDカードへのコピーはできます。

対処方法や代替方法をご存じでしたらお教えください。

ソースはC#で以下のようなものです。

[code]

    string dstPathName = @"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\\?\usb#vid_xxxx&pid_xxxx#xxxxxxxxxxxxxxx#{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\SDカード\mydata"
    
    //dataにはクリップボードのデータ。スマホのSDカード内のファイルをエクスプローラで右クリック、コピーした状態。
    IDataObject data = Clipboard.GetDataObject();
    Guid IID_IShellItem = typeof(IShellItem).GUID;
    IntPtr pDstFullIDL = ILCreateFromPath(dstFolderName);
    IShellItem dstItem = null;
    SHCreateItemFromIDList(pDstFullIDL, ref IID_IShellItem, out dstItem);
    
    IFileOperation fo = (IFileOperation)new FileOperation();
    fo.CopyItems(data, dstItem);
    fo.SetOperationFlags(FileOperationFlags.FOF_RENAMEONCOLLISION);
    
    try{fo.PerformOperations();}
    catch{}
    
    //--------------------------------------------------------------
    [ComImport]
    [Guid("3ad05575-8857-4850-9277-11b85bdb8e09")]
    public class FileOperation
    {
    }
    
    [ComImport]
    [Guid("947aab5f-0a5c-4c13-b4d6-4bf7836fc9f8")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface IFileOperation
    {
        uint Advise(IFileOperationProgressSink pfops);
        void Unadvise(uint dwCookie);
    
        void SetOperationFlags(FileOperationFlags dwOperationFlags);
        void SetProgressMessage([MarshalAs(UnmanagedType.LPWStr)] string pszMessage);
        void SetProgressDialog([MarshalAs(UnmanagedType.Interface)] object popd);
        void SetProperties([MarshalAs(UnmanagedType.Interface)] object pproparray);
        void SetOwnerWindow(uint hwndParent);
    
        void ApplyPropertiesToItem(IShellItem psiItem);
        void ApplyPropertiesToItems([MarshalAs(UnmanagedType.Interface)] object punkItems);
    
        void RenameItem(IShellItem psiItem, [MarshalAs(UnmanagedType.LPWStr)] string pszNewName,
            IFileOperationProgressSink pfopsItem);
    
        void RenameItems(
            [MarshalAs(UnmanagedType.Interface)] object pUnkItems,
            [MarshalAs(UnmanagedType.LPWStr)] string pszNewName);
    
        void MoveItem(
            IShellItem psiItem,
            IShellItem psiDestinationFolder,
            [MarshalAs(UnmanagedType.LPWStr)] string pszNewName,
            IFileOperationProgressSink pfopsItem);
    
        void MoveItems(
            [MarshalAs(UnmanagedType.Interface)] object punkItems,
            IShellItem psiDestinationFolder);
    
        int CopyItem(
            IShellItem psiItem,
            IShellItem psiDestinationFolder,
            [MarshalAs(UnmanagedType.LPWStr)] string pszCopyName,
            IFileOperationProgressSink pfopsItem);
    
        int CopyItems(
            [MarshalAs(UnmanagedType.Interface)] object punkItems,
            IShellItem psiDestinationFolder);
    
        void DeleteItem(
            IShellItem psiItem,
            IFileOperationProgressSink pfopsItem);
    
        void DeleteItems([MarshalAs(UnmanagedType.Interface)] object punkItems);
    
        uint NewItem(
            IShellItem psiDestinationFolder,
            FileAttributes dwFileAttributes,
            [MarshalAs(UnmanagedType.LPWStr)] string pszName,
            [MarshalAs(UnmanagedType.LPWStr)] string pszTemplateName,
            IFileOperationProgressSink pfopsItem);
    
        void PerformOperations();
    
        [return: MarshalAs(UnmanagedType.Bool)]
        bool GetAnyOperationsAborted();
    }
    
    [ComImport]
    [Guid("04b0f1a7-9490-44bc-96e1-4296a31252e2")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IFileOperationProgressSink
    {
        void StartOperations();
        void FinishOperations(uint hrResult);
    
        void PreRenameItem(uint dwFlags, IShellItem psiItem, [MarshalAs(UnmanagedType.LPWStr)] string pszNewName);
        void PostRenameItem(uint dwFlags, IShellItem psiItem, [MarshalAs(UnmanagedType.LPWStr)] string pszNewName,
            uint hrRename, IShellItem psiNewlyCreated);
    
        void PreMoveItem(uint dwFlags, IShellItem psiItem, IShellItem psiDestinationFolder,
            [MarshalAs(UnmanagedType.LPWStr)] string pszNewName);
        void PostMoveItem(uint dwFlags, IShellItem psiItem, IShellItem psiDestinationFolder,
            [MarshalAs(UnmanagedType.LPWStr)] string pszNewName, uint hrMove, IShellItem psiNewlyCreated);
    
        void PreCopyItem(uint dwFlags, IShellItem psiItem, IShellItem psiDestinationFolder, [MarshalAs(UnmanagedType.LPWStr)] string pszNewName);
        void PostCopyItem(uint dwFlags, IShellItem psiItem, IShellItem psiDestinationFolder, [MarshalAs(UnmanagedType.LPWStr)] string pszNewName,
            uint hrCopy, IShellItem psiNewlyCreated);
    
        void PreDeleteItem(uint dwFlags, IShellItem psiItem);
        void PostDeleteItem(uint dwFlags, IShellItem psiItem, uint hrDelete, IShellItem psiNewlyCreated);
    
        void PreNewItem(uint dwFlags, IShellItem psiDestinationFolder, [MarshalAs(UnmanagedType.LPWStr)] string pszNewName);
        void PostNewItem(uint dwFlags, IShellItem psiDestinationFolder, [MarshalAs(UnmanagedType.LPWStr)] string pszNewName,
             [MarshalAs(UnmanagedType.LPWStr)] string pszTemplateName, uint dwFileAttributes,
             uint hrNew, IShellItem psiNewItem);
    
        void UpdateProgress(uint iWorkTotal, uint iWorkSoFar);
    
        void ResetTimer();
        void PauseTimer();
        void ResumeTimer();
    }
    
    [Flags]
    public enum FileOperationFlags : uint
    {
        FOF_SILENT = 0x0004,                
        FOF_NOCONFIRMATION = 0x0010,        
        FOF_ALLOWUNDO = 0x0040,             
        FOF_SIMPLEPROGRESS = 0x0100,        
        FOF_NOERRORUI = 0x0400,             
        FOF_WANTNUKEWARNING = 0x4000,       
        FOF_RENAMEONCOLLISION = 0x0008,
    }
    
[/code]


CC BY-SA 4.0
2021-11-20T08:24:04.360
83730
2021-11-22T08:31:48.193
2021-11-20T08:44:53.960
3060
question
c#
IFileOperationでWPD（スマホ）のSDカードフォルダ内でファイルコピーできない


試しておらず当てずっぽうですが。

[`IFileOperation::CopyItems`](https://docs.microsoft.com/en-
us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-
copyitems)は`IDataObject`も受け付けますがそれ以外にも`IShellItemArray`や`IEnumShellItems`も受け付けています。[`SHCreateShellItemArrayFromDataObject`](https://docs.microsoft.com/en-
us/windows/win32/api/shobjidl_core/nf-shobjidl_core-
shcreateshellitemarrayfromdataobject)で`IShellItemArray`に変換しこれを渡してみるのはどうでしょうか？  
なお、ここで出てくる`IDataObject`はC#においては[`System.Windows.Forms.IDataObject`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.windows.forms.idataobject?view=windowsdesktop-6.0)
**ではなく**
、[`System.Runtime.InteropServices.ComTypes.IDataObject`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.runtime.interopservices.comtypes.idataobject?view=net-6.0)を指します。


CC BY-SA 4.0
2021-11-21T12:25:17.830
83744
2021-11-21T12:25:17.830
4236
83730
answer


NuGetのMediaDevicesというライブラリでアクセス出来るようです。

[How to read files on Android phone from C# program on Windows
7?](https://stackoverflow.com/questions/25026799/how-to-read-files-on-android-
phone-from-c-sharp-program-on-windows-7)  
[MediaDevices](https://www.nuget.org/packages/MediaDevices/)

内部では、[WPD Application Programming Interface](https://docs.microsoft.com/en-
us/windows/win32/wpd_sdk/wpd-application-programming-interface) が使用されているようです。


CC BY-SA 4.0
2021-11-22T08:31:48.193
83767
2021-11-22T08:31:48.193
41943
83730
answer