C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

CD-Rへ同名フォルダ書き込み時のエラー /YAMA (19/09/04(Wed) 10:14) #92232
Re[1]: CD-Rへ同名フォルダ書き込み時のエラー /furu (19/09/04(Wed) 10:45) #92233
│└ Re[2]: CD-Rへ同名フォルダ書き込み時のエラー /YAMA (19/09/04(Wed) 11:18) #92234
│  └ Re[3]: CD-Rへ同名フォルダ書き込み時のエラー /とっちゃん (19/09/04(Wed) 11:28) #92235
│    └ Re[4]: CD-Rへ同名フォルダ書き込み時のエラー /YAMA (19/09/04(Wed) 11:39) #92236
│      └ Re[5]: CD-Rへ同名フォルダ書き込み時のエラー /とっちゃん (19/09/04(Wed) 13:01) #92238
Re[1]: CD-Rへ同名フォルダ書き込み時のエラー /魔界の仮面弁士 (19/09/04(Wed) 11:57) #92237
  └ Re[2]: CD-Rへ同名フォルダ書き込み時のエラー /YAMA (19/09/04(Wed) 14:55) #92244
    └ Re[3]: CD-Rへ同名フォルダ書き込み時のエラー /魔界の仮面弁士 (19/09/04(Wed) 15:06) #92245
      └ Re[4]: CD-Rへ同名フォルダ書き込み時のエラー /YAMA (19/09/05(Thu) 14:22) #92258 解決済み


親記事 / ▼[ 92233 ] ▼[ 92237 ]
■92232 / 親階層)  CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ YAMA (1回)-(2019/09/04(Wed) 10:14:34)

分類:[C#] 

VisualStudio2015  C# で開発中です。

CD-Rを書き込みする機能が必要で
CodeProjectのサイトを調べていたところ
「Burning and Erasing CD/DVD/Blu-ray Media with C# and IMAPI2」
https://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD?fid=1134078&df=90&mpp=25&prof=True&sort=Position&view=Normal&spc=Relaxed&fr=326
というものを見つけ、一通り必要そうな書き込み・消去等ができることは確認できました。

1つ問題があり、困っています。

@CD-Rにフォルダ+ファイルを書き込み(CDは閉じない)
\CD
|___[フォルダA] 
  ファイルB
  ファイルC

という状態で作成しました。ここまでは問題ありませんでした。


Aさらに追加で(上記サンプルでは同じフォルダAを2回書き込み形です)
\CD
|___[フォルダA] 
  ファイルB(変更あり)
  ファイルY
というものを追記して

【完成予想図】
\CD
|___[フォルダA] 
  ファイルB(変更あり)
  ファイルC
  ファイルY

とういうディスクを作りたかったのですがフォルダAを2回目に書き込もうとしたところ、上記サンプルソース内の
public bool AddToFileSystem(IFsiDirectoryItem rootItem)
{
try
{
rootItem.AddTree(m_directoryPath, true);
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error adding folder",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return false;
}
}

という部分のcatchに引っ掛かり(フォルダ名は既に存在する)できませんでした。
どうしたら既存フォルダがあってもお構いなしに追加できるのでしょうか?



[ □ Tree ] 返信 編集キー/

▲[ 92232 ] / ▼[ 92234 ]
■92233 / 1階層)  Re[1]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ furu (7回)-(2019/09/04(Wed) 10:45:37)
No92232 (YAMA さん) に返信
CD-Rなんだから、追記しかできないと思う。
[ 親 92232 / □ Tree ] 返信 編集キー/

▲[ 92233 ] / ▼[ 92235 ]
■92234 / 2階層)  Re[2]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ YAMA (2回)-(2019/09/04(Wed) 11:18:05)
2019/09/04(Wed) 11:26:57 編集(投稿者)

No92233 (furu さん) に返信
> ■No92232 (YAMA さん) に返信
> CD-Rなんだから、追記しかできないと思う。
おっしゃる通り、「追記」しかできないですが、
同名のデータが書き込まれる場合は元あったデータを「読めなくする」処理→別のエリアに新規に書き込みする(使用できるディスク容量はどんどん減っていく)ということをディスク内でしてくれてるのではないでしょうか?

ちなみにフォルダではなくルート階層に同名のファイルで内容だけ変更したものを何度も書き込むことはできることは確認できております。
なので質問の趣旨としては「同名フォルダはなぜダメなのか?回避策はないのか?」という点でお聞きした次第です。

今回の書き込み操作を
Windowsの標準機能でエクスプローラ上にドラッグして「書き込む準備ができました」状態→書き込みを行うと上記の目的としているフォルダ構造で完成します。
※空ディスクを初回入れたときに選択肢がでますが「USBのように使うモード」のほうは選択していません。
市販のCD-R書き込みソフトでCDを閉じずに同様の書き込みを行っても完成しました。




[ 親 92232 / □ Tree ] 返信 編集キー/

▲[ 92234 ] / ▼[ 92236 ]
■92235 / 3階層)  Re[3]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ とっちゃん (627回)-(2019/09/04(Wed) 11:28:56)

Image Mastering API(CD/DVDを作るためのAPIセット)のリファレンスルートを張っておきますね。
自分では、ISOファイル作成しか行ったことがないので、CD-R などの書き込みオンリー系の機能は使ったことがないので、細かくチェックしたことはありませんが
なにか乗ってるかもしれません。

https://docs.microsoft.com/en-us/windows/win32/imapi/portal


[ 親 92232 / □ Tree ] 返信 編集キー/

▲[ 92235 ] / ▼[ 92238 ]
■92236 / 4階層)  Re[4]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ YAMA (3回)-(2019/09/04(Wed) 11:39:58)
No92235 (とっちゃん さん) に返信
>
> Image Mastering API(CD/DVDを作るためのAPIセット)のリファレンスルートを張っておきますね。
> 自分では、ISOファイル作成しか行ったことがないので、CD-R などの書き込みオンリー系の機能は使ったことがないので、細かくチェックしたことはありませんが
> なにか乗ってるかもしれません。
>
> https://docs.microsoft.com/en-us/windows/win32/imapi/portal
>
>

情報ありがとうございます。
https://docs.microsoft.com/en-us/windows/win32/api/imapi2fs/nf-imapi2fs-ifsidirectoryitem-addtree

翻訳しながら見てみましたが、IMAPI_E_DUP_NAME  名前がすでに存在します。
このエラーですね。
対策はわからず・・
ちなみにCD-RWでも結果は同じでした。
参考までに質問ですが、ISOファイルの場合は一度作ったものに対して同名フォルダを追記ということはされることはないのでしょうか?毎回新規に作り直すのであれば発生しないのかもしれませんが・・。

[ 親 92232 / □ Tree ] 返信 編集キー/

▲[ 92236 ] / 返信無し
■92238 / 5階層)  Re[5]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ とっちゃん (628回)-(2019/09/04(Wed) 13:01:03)
No92236 (YAMA さん) に返信
> 参考までに質問ですが、ISOファイルの場合は一度作ったものに対して同名フォルダを追記ということはされることはないのでしょうか?毎回新規に作り直すのであれば発生しないのかもしれませんが・・。
>
ISOは、メディアイメージとしては、CD-ROM/DVD-ROM とリードオンリー形式にするので、毎回新規作成です。
書き換え処理ができる構成(CD-R など)は試したことがないのでわかりません。

[ 親 92232 / □ Tree ] 返信 編集キー/

▲[ 92232 ] / ▼[ 92244 ]
■92237 / 1階層)  Re[1]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ 魔界の仮面弁士 (2353回)-(2019/09/04(Wed) 11:57:28)
2019/09/04(Wed) 12:04:10 編集(投稿者)

No92232 (YAMA さん) に返信
> public bool AddToFileSystem(IFsiDirectoryItem rootItem)

手元に環境が無いので試せませんが、エラーメッセージからすると
rootItem[m_directoryPath] が既に存在している状態なので
rootItem.AddTree(m_directoryPath, true); が失敗していたのかも。

https://docs.microsoft.com/en-us/windows/win32/api/imapi2fs/nf-imapi2fs-ifsidirectoryitem-addtree

EnumFsiItems を列挙して存在確認して、未登録の場合にのみ
追加するという事はできないでしょうか。

あとは AddTree ではなく、AddDirectory にしてみるとか…。
(階層が深くなる場合は、再帰的に呼び出す必要がありそうですが)
[ 親 92232 / □ Tree ] 返信 編集キー/

▲[ 92237 ] / ▼[ 92245 ]
■92244 / 2階層)  Re[2]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ YAMA (5回)-(2019/09/04(Wed) 14:55:32)
rootItem.AddTree(m_directoryPath, false);
これを
rootItem.AddDirectory(m_directoryPath);
に変更してみましたが、当該行で同じエラーが発生してしまいますね。


魔界の仮面弁士様の案にありました
EnumFsiItems を列挙して存在確認して、未登録の場合にのみ追加する
という方法も考えたことがあったのですが、

\CD
|___[フォルダA]  @既存のためAddTreeしない
  ファイルB   Aここに出力
という流れになるかとおもうのですがAの 指定フォルダの中に出力とい方法がわからず まだうまくいっていない状況です。
まだサンプルを使いこなしてないのでもう少し自分でもあがいてみます。

[ 親 92232 / □ Tree ] 返信 編集キー/

▲[ 92244 ] / ▼[ 92258 ]
■92245 / 3階層)  Re[3]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ 魔界の仮面弁士 (2356回)-(2019/09/04(Wed) 15:06:05)
2019/09/04(Wed) 15:07:40 編集(投稿者)

No92244 (YAMA さん) に返信
> \CD
> |___[フォルダA]  @既存のためAddTreeしない
>   ファイルB   Aここに出力
> という流れになるかとおもうのですがAの 指定フォルダの中に出力とい方法がわからず

使ったことが無いので、単なる予想コードですが:

rootItem.AddDirectory(フォルダAパス);
IFsiItem fiFolderA = rootItem[フォルダAパス];
IFsiDirectoryItem fdiFolderA = fiFolderA as IFsiDirectoryItem;
if (fdiFolderA != null)
{
  fdiFolderA.AddFile(ファイルB, ストリーム);
}
[ 親 92232 / □ Tree ] 返信 編集キー/

▲[ 92245 ] / 返信無し
■92258 / 4階層)  Re[4]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ YAMA (6回)-(2019/09/05(Thu) 14:22:04)
アドバイスありがとうございました。
結論として、うまくできました。
書き込みフォルダは作ってみる。既存であれば作らない。どちらにしても当該フォルダに同階層のファイルを追加。同階層内にあるフォルダは1階層下に潜り同様の処理を繰り返す。
という流れでした。

元が文頭のサンプルソースなうえ、量が多いため全部は書きませんが・・、

rootItem.AddTree(指定フォルダパス, false); //書き込む[指定フォルダパス]フォルダ(同階層のファイル・サブフォルダ含む)を「新規追加」。※メディアに同名フォルダがあるとNG
これを廃止し、

@ rootItem.AddDirectory([指定フォルダ名]); //書き込む[指定フォルダA名]フォルダだけ(同階層のファイル・サブフォルダを含まない)を作成・追加。※メディアに同名フォルダがあるとNG
A同名フォルダがあるとtry catchに引っ掛かるが無視。
Bこの時点でどちらにしても[指定フォルダ]が存在することになる。
C[指定フォルダ]のファイル・サブフォルダをチェック
string[] files = Directory.GetFiles(指定フォルダパス);
string[] dirs = Directory.GetDirectories(指定フォルダパス);
D同階層のファイルを[指定フォルダ]に追加
 rootItem.AddFile(*****) 
E同階層のフォルダを1フォルダずつ順に指定して@〜Eの再帰処理
という感じです。


多くのアイディアをいただき、大変助かりました。
ありがとうございました
解決済み
[ 親 92232 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -