none
コマンドプロンプトで漢字表記のシステムファイルが扱えない RRS feed

  • 質問

  • OSはWindows7です。
    コマンドプロンプトやバッチファイルで、ファイル名に漢字を使ったファイルを扱うと「指定されたファイルが見つかりません。」というエラーが発生します。

    copy "C:\Windows\Media\音声不明瞭.wav" F:\

    実際に、C:\Windows\Media\にはこのファイルがあるのですが、chord.wavは正常に処理できます。
    どうすれば処理できるのでしょうか。

    (やりたいことはcopyではなく、ほかのコマンドです。この処理が成功したら、バッチファイルを作成してVisual Studioでアプリケーションに応用します。)
    よろしく御回答をお願いします。
    2019年10月7日 22:45

回答

  • エクスプローラーで、音声不明瞭.wav を [Shift] キーを押しながら右クリックして "パスとしてコピー" を選択してみてください。

    コピーされたパスが "C:\Windows\Media\Speech Off.wav" になってはいませんか?

    恐らく DIR "C:\Windows\Media\*.wav" コマンドでは、日本語ファイル名が現れない状態だと思います。

    物理ファイルとしてはあくまでも "Seech Off.wav" という名前であり、漢字表記は、エクスプローラー上でだけで見える各国語表記です。

    コマンドプロンプトから「notepad.exe C:\Windows\Media\Desktop.ini」で開いてみると、別名表記の対象となっているファイルの一覧が見えるかも。

    これを.Net Frameworkの機能を利用してプログラムで読み取ることができないでしょうか。

    たとえば、Directory.GetFiles メソッド や OpenFileDialog クラスは、見せ掛けの各国語表記ではなく、物理パスの方を返すようになっています。

    listBox1.DataSource = System.IO.Directory.GetFiles(@"C:\Windows\Media", "*.wav");

    2019年10月8日 3:11

すべての返信

  • 過去の事例では、ファイル名に「ゼロ幅文字」「非可読文字」「非日本語圏向けの類似漢字」が混入することで、正しくアクセスできていなかったということがありました。

    コマンドプロンプトから「DIR /X」コマンドを実行し、該当ファイルの 8dot3 形式の短い別名を取得し、ショートネームでアクセスしてみてください。

    ただしシステムドライブが SSD として出荷されたシステムだと、8dot3 ファイル名の生成機能が Off になっていることもあります。その場合は該当ファイルをコピーして、ファイル名を 12345.WAV などの単純な名前にしてアクセスできるかを確認してみてください。その後、本来あるべき漢字名に手作業でリネームしなおすことで、非可読文字の混入を防げるかと思います。

    ファイル名の指定が正しいのにエラーになるようであれば、アクセス権限の問題かもしれません。コマンドプロンプトを「管理者として実行」モードで試した場合にも失敗するかどうか、確認してみてください。

    また、Windows エクスプローラーで該当ファイルのプロパティを開いて、下記の項目もご確認を。

    • [全般]タブの下部に、[ロックの解除]のチェックがあれば、ロックを解除しておく。
    • [セキュリティ]タブで、バッチファイルの実行ユーザーに対する読み取りアクセス権があるかを確認する。
    2019年10月8日 1:04
  • 魔界の仮面弁士さん、御回答ありがとうございます。

    コマンドプロンプトを「管理者として実行」で起動してdir C:\windows\media /x を実行しましたが、8dot3 形式のファイル名が表示されませんでした。
    システムの入ったディスクはSSDではなく、HDDです。
    C:\windows\media 内に「Speech Off.wav」というファイルがありましたので、これがエクスプローラーで表示される「音声認識オフ.wav」だと判断し、Speech Off.wavにcopyコマンドを実行したらコピーは成功し、ファイルダンプをした結果「音声認識オフ.wav」と同一のファイルでした。
    ただ、コピーのdestinationファイル名はSpeech Off.wavであり、元の名前が「音声認識オフ.wav」であるという情報を持たないので、リネームは手動で行うしかありません。

    アクセス権限を変えようとしても、TAKEOWNコマンドを実行すると、漢字の使われたファイルに対しては「指定されたファイルが見つかりません。」が表示されて処理できません。

    コマンドプロンプトを「管理者として実行」で起動して、copy "C:\Windows\Media\音声不明瞭.wav" F:\ を実行しましたが、「指定されたファイルが見つかりません。」が表示されました。

    なお、音声不明瞭.wavのプロパティーに、該当するファイルロックのチェックは付けられていませんでした。同じくアクセス許可はAdoministratorに対して読み取りと実行+読み取りに許可が付けられています。

    ----

    ここで初めて分かりましたが、音声不明瞭.wavのプロパティーの「セキュリティー」タブをクリックすると画面の上部に「C:\Windows\Media\Speech Off.wav」と表示されています。これをファイルから読み取れば、コマンドプロンプトで扱うことができるのではないかと考えています。これを.Net Frameworkの機能を利用してプログラムで読み取ることができないでしょうか。

    継続してサポートをお願いします。
    2019年10月8日 2:50
  • エクスプローラーで、音声不明瞭.wav を [Shift] キーを押しながら右クリックして "パスとしてコピー" を選択してみてください。

    コピーされたパスが "C:\Windows\Media\Speech Off.wav" になってはいませんか?

    恐らく DIR "C:\Windows\Media\*.wav" コマンドでは、日本語ファイル名が現れない状態だと思います。

    物理ファイルとしてはあくまでも "Seech Off.wav" という名前であり、漢字表記は、エクスプローラー上でだけで見える各国語表記です。

    コマンドプロンプトから「notepad.exe C:\Windows\Media\Desktop.ini」で開いてみると、別名表記の対象となっているファイルの一覧が見えるかも。

    これを.Net Frameworkの機能を利用してプログラムで読み取ることができないでしょうか。

    たとえば、Directory.GetFiles メソッド や OpenFileDialog クラスは、見せ掛けの各国語表記ではなく、物理パスの方を返すようになっています。

    listBox1.DataSource = System.IO.Directory.GetFiles(@"C:\Windows\Media", "*.wav");

    2019年10月8日 3:11
  • 処理対象ファイルの入力方法を、WPFコントロールへのファイルのドラッグ&ドロップとしました。こうすることで音声不明瞭.wavというファイルを取得した時に"Speech Disambiguation.wav"というファイル名が得られることが分かりました。

    これで開発を進めることができる様になりました。

    試行中に気付いたことですが、エクスプローラーの手動操作で音声不明瞭.wavのショートカットを作成すると、.lnk内のプロパティーにSpeech Disambiguation.wavが記録されていたので、これは使えると思いました。

    今回の御回答は、参考にさせていただける点が豊富で助かりました。

    御回答誠にありがとうございました。

    2019年10月8日 6:25
  • エクスプローラの、列の追加で(名前でなく)、「ファイル名」を追加して表示させる手はあります

    jzkey

    2019年10月8日 6:38