UDF としてフォーマットされた光学式ディスクでファイルの上書き、またはデータの追記に失敗する場合がある

現象

以下のシナリオがあるとします。

● シナリオ A

1. 空の光学式ディスクを光学式ドライブに挿入し、UDF (Universal Disk Format)としてフォーマットします。
2. 小さいサイズ (2 KB 以下) のテキストファイルを光学式ディスク上に作成します。
3. 手順 2 で作成したファイルを空のファイル (0 KB) で上書きコピーします。

結果:
0 KB のファイルに置き換えられることが期待されますが、手順 2 で作成したファイルが残ります。

● シナリオ B
1. 空の光学式ディスクを光学式ドライブに挿入し、UDF としてフォーマットします。
2. “AAAAA” というデータを書き込んだテキスト ファイルをメディア上に作成します。
3. CreateFile 関数に CREATE_ALWAYS フラグをセットし、手順 2 で作成したファイルを開きます。
4. WriteFile 関数を利用してファイルのデータを ”BBB” に上書きします。

結果:
“BBB” と書き込まれたファイルが作成されることが期待されますが、”BBBAA” と書き込まれたファイルが作成されます。

原因

上記シナリオの現象は、udfs.sys の問題により、上書きされるファイル サイズが正常に設定されていないため、発生します。

回避策

● シナリオ A の場合
1. 光学式ディスク上にある上書きされなかったファイルを一旦削除します。
2. あらためて空のファイルをコピーします。

● シナリオ B の場合
1. CreateFile 関数に CREATE_ALWAYS フラグをセットし、”AAAAA” が書き込まれたファイルを開きます。
2. SerFilePointer 関数を利用してファイルポインタをファイルの先頭に移動します。
3. SetEndOfFile 関数を利用して EOF を設定します。結果ファイルサイズはゼロになります。
4. WriteFile 関数を利用してデータを書き込みます。

詳細

シナリオ B の問題は以下のコードを利用した場合発生します。

C/C++

現象発生コード
HANDLE hFile = CreateFile (fileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,                   FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile, DataBuffer, dwBytesToWrite, &dwBytesWritten, NULL); 

回避コード

HANDLE hFile = CreateFile (fileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,                   FILE_ATTRIBUTE_NORMAL, NULL); SetFilePointer(hFile, 0, NULL, FILE_BEGIN);  SetEndOfFile(hFile); WriteFile(hFile, DataBuffer, dwBytesToWrite, &dwBytesWritten, NULL); 

C#

現象発生コード

using(var fs = new System.IO.FileStream(fileName, FileMode.Create, FileAccess.Write)) 
{                fs.WriteByte(value); }

回避コード

using(var fs = new System.IO.FileStream(fileName, FileMode.Create, FileAccess.Write)) 
{
fs.SetLength(0);
fs.WriteByte(value);
}


また、ライブ ファイル システムにフォーマットされた光メディアも UDF を利用しているため、同様の現象が発生します。

状況

マイクロソフトは、この問題を「対象製品」セクションに記載されているマイクロソフト製品の問題として認識しています。
プロパティ

文書番号:2997657 - 最終更新日: 2016/09/29 - リビジョン: 1

フィードバック