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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.92232 の関連記事表示

<< 0 >>
■92232  CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ YAMA -(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に引っ掛かり(フォルダ名は既に存在する)できませんでした。
    どうしたら既存フォルダがあってもお構いなしに追加できるのでしょうか?


親記事 /過去ログ159より / 関連記事表示
削除チェック/

■92233  Re[1]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ furu -(2019/09/04(Wed) 10:45:37)
    No92232 (YAMA さん) に返信
    CD-Rなんだから、追記しかできないと思う。
記事No.92232 のレス /過去ログ159より / 関連記事表示
削除チェック/

■92234  Re[2]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ YAMA -(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を閉じずに同様の書き込みを行っても完成しました。



記事No.92232 のレス /過去ログ159より / 関連記事表示
削除チェック/

■92235  Re[3]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ とっちゃん -(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

記事No.92232 のレス /過去ログ159より / 関連記事表示
削除チェック/

■92236  Re[4]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ YAMA -(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ファイルの場合は一度作ったものに対して同名フォルダを追記ということはされることはないのでしょうか?毎回新規に作り直すのであれば発生しないのかもしれませんが・・。
記事No.92232 のレス /過去ログ159より / 関連記事表示
削除チェック/

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

■92237  Re[1]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ 魔界の仮面弁士 -(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 にしてみるとか…。
    (階層が深くなる場合は、再帰的に呼び出す必要がありそうですが)
記事No.92232 のレス /過去ログ159より / 関連記事表示
削除チェック/

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


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

    \CD
    |___[フォルダA]  @既存のためAddTreeしない
      ファイルB   Aここに出力
    という流れになるかとおもうのですがAの 指定フォルダの中に出力とい方法がわからず まだうまくいっていない状況です。
    まだサンプルを使いこなしてないのでもう少し自分でもあがいてみます。
記事No.92232 のレス /過去ログ159より / 関連記事表示
削除チェック/

■92245  Re[3]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ 魔界の仮面弁士 -(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, ストリーム);
    }
記事No.92232 のレス /過去ログ159より / 関連記事表示
削除チェック/

■92258  Re[4]: CD-Rへ同名フォルダ書き込み時のエラー
□投稿者/ YAMA -(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の再帰処理
    という感じです。


    多くのアイディアをいただき、大変助かりました。
    ありがとうございました
記事No.92232 のレス / END /過去ログ159より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -