次のコードを使用して、Windows ポータブル デバイス API を使用して、FileInfo オブジェクトでラップされたファイルを MTP デバイスにコピーしています。
public static void CopyFileToDevice(PortableDeviceFolder parent, string name, FileInfo file)
{
IPortableDeviceValues values = GetRequiredPropertiesForContentType(parent.Id, name, file.Length);
PortableDeviceApiLib.IStream tempStream;
uint blockSize = 0;
parent.Device.Content.CreateObjectWithPropertiesAndData(
values,
out tempStream,
ref blockSize,
null);
System.Runtime.InteropServices.ComTypes.IStream targetStream =
(System.Runtime.InteropServices.ComTypes.IStream)tempStream;
try
{
using (var sourceStream = file.OpenRead())
{
var buffer = new byte[blockSize];
int bytesRead;
do
{
bytesRead = sourceStream.Read(buffer, 0, (int)blockSize);
targetStream.Write(buffer, bytesRead, IntPtr.Zero);
} while (bytesRead > 0);
}
targetStream.Commit(0);
}
finally
{
Marshal.ReleaseComObject(tempStream);
}
parent.Refresh();
}
これで問題なく動作しますが、小さなファイル (この場合は数 kiB のテキストのみの .m3u ファイル) を書き込む場合、次の行
targetStream.Commit(0);
実行に非常に時間がかかります。数 MiB のファイルを書き込むときは、何も問題はありません。なぜこれが起こっているのか、どうすればこれを修正できるのかを知りたいです。ありがとう!