Cのプログラムで fp = fopen(filename,"rb"); を実行すると必ずエラーになるファイル名があります。
色々調べた結果、エラーになるファイル名にSJISに存在しない文字コードが含まれているらしいことがわかりました。
そのようなファイル名の文字コードをSJISの類似の文字コードに
例えば、⓪ → (0) のようにエクスプローラ上での手作業で変更すれば読めることも確認しています。
これらの作業をするアプリをCで作成しようと思いましたが、エラーになるファイル名の検出まではできますが、
関数rename(読めないファイル名、読めるファイル名);
でエラーになってしまい、ファイル名変更ができません。読めないファイル名はfopenでエラーになるので、関数renameでもエラーになるのは当然ですが・・・
一方、文字コードをunicode にすれば読めますが、今度はSJISで読めないファイル名の検出ができません。
で質問です
個別の手作業ではなく、一括してこれらの作業ができるコマンドやアプリ、教えてください
No.5ベストアンサー
- 回答日時:
No3です。
下記URLへアップしました。
https://ideone.com/Fu7bKq
Python 3.12.5で動作確認しています。
スクリプトはUTF-8で保存してください。
ファイル名は、rename.pyとします。
pythonにパスが通っているものととします。
コマンドプロンプトで
python rename.py と入力すると以下のメッセージが表示されます。
------------------------------------------
指定されたディレクトリ下のファイルについて再帰的に以下の処理行う
rename.py P1 P2
P1:機能コード
list :SJISに変換できないファイルの一覧を出力する
exec :SJISに変換できないファイルをSJISに変換可能なファイルにリネームする
P2:ディレクトリ名
---------------------------------------
1.機能コード:list
listを指定すると、SJISに変換できないファイルの一覧を表示します。
(ファイル名の変更は行いません)
実行結果の例は、以下のようになります。(実行結果例)
-------------------------------------
python rename.py list data
chcp 65001
rename "D:\goo\python\data\名古屋⓼.py" "名古屋(1).py"
rename "D:\goo\python\data\大阪⓷.py" "大阪(2).py"
rename "D:\goo\python\data\東京⓹.py" "東京(3).py"
rename "D:\goo\python\data\dir2\博多⓹.py" "博多(4).py" 変更後のファイル名が存在します
処理終了 リネーム対象となるファイル件数=4
---------------------------------------------
左側がSJISに変換できないファイル名です。
右側が変換できない文字を(N)に変えた結果です。Nは1~の通番
博多⓹.pyの場合、博多(4).pyが既にD:\goo\python\data\dir2内に存在するので、
「変更後のファイル名が存在します」のメッセージが右側に表示されます。
ここに表示された結果は、同時にカレントディレクトリのlog.txt(UTF-8の文字コード)にも出力されます。
このlog.txtをlog.batに変えることにより、ファイル名を変換するためのバッチファイルが簡単に作れます。
バッチファイルとして、使われることを考慮して、
chcp 65001(コマンドプロンプトの文字コードをUTF8対応にする)
rename
の文字が追加されています。
バッチファイルを作る際は、
①右側のファイル名をほかのファイル名にしたいなら、そのように変更する。
②「変更後のファイル名が存在します」の文字が表示された場合は、そのファイル名は使えないので
ほかのファイル名にする。又、この「変更後のファイル名が存在します」の文字は削除する。
③最後の行(処理終了 リネーム対象となるファイル件数=・・)は削除する。
上記を行ってください。
2.機能コード:exec
execを指定するとSJISに変換できないファイル名をSJISに変換できるファイル名に変更します。
実行結果は以下のようになります。(実行結果例)
-----------------------------------
python rename.py exec data
D:\goo\python\data\名古屋⓼.py ==> 名古屋(1).py
D:\goo\python\data\大阪⓷.py ==> 大阪(2).py
D:\goo\python\data\東京⓹.py ==> 東京(3).py
処理終了 リネーム件数=3
以下の1件のファイルがリネームできませんでした
D:\goo\python\data\dir2\博多⓹.py ==> 博多(4).py
------------------------------------
左側がリネーム前のファイルで、右側がリネーム後のファイル名です。
3件のファイルがリネームされましたが、博多⓹.pyは、既に博多(4).pyが存在するので
リネームされませんでした。
上記の内容は、log.txtにも出力されます。
No.3
- 回答日時:
OSはwindowsでしょうか。
pythonで良ければ、以下のような機能をもつスクリプトを提供可能です。
必要であれば、その旨補足ください。
1.指定されたフォルダ内のすべてのファイルに対して、以下の処理を行う。
2.ファイル名がUTF-8からSJISに変更可能なら処理対象外とする。
3.ファイル名がUTF-8からSJISに変更できない場合、その文字を
(n)に置き換える。(nは1からの連番を割り当てる)
4.ファイル名を上記3で変更したファイル名にリネームする。
フォルダ名がUTF-8からSJISに変換できないケースは考慮しない。
そのようなケースがあっても、フォルダ名のリネームは行わない。
No.2
- 回答日時:
うーん、使えない文字のファイル名も文字列としては扱えるのですかね。
できるならプログラム内でファイル名変換するのではなく、ファイル名変換のバッチファイルを吐かせるという方法はどうでしょうか。
それもできないようだと明示的に文字コードを変換してSJISとUnicodeを併用するプログラムを書く必要がありますけど。
応答ありがとうございます
バッチファイルはSJISでなくてもいいのでしょうか?
SJISしかダメと思ってました。
確かに、Unicodeで書かれたバッチファイルが許されるなら、のぞみありそうです。
検討したいと思います。
No.1
- 回答日時:
文字コードを入れ替えながら作業すればよいのでは?
ロケールを文字コードUTF8にしてディレクトリのファイル名をリストした後、
文字コードSJISに変えて読めないファイル名のエラーを検出、
再び文字コードUTF8でリネームすればいいと思うけど。どうかな?
参考↓
http://www1.kokusaika.jp/advisory/org/ja/c_local …
応答ありがとうござます
なるほど、
fp = fopen(filename,"rb"); を実行してエラーになるファイル名の検出
する代わりに、
UTF8で書かれたテキストファイルから、文字コードSJISに変えて読めないファイル名のエラーを検出
するのですね
アイデアありがとうございます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) xmlドキュメントから別拡張子で保存したい 4 2023/09/12 11:08
- その他(ゲーム) ゲームMODのpakファイルを開けない 2 2023/12/17 14:14
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/11/09 11:51
- Windows 10 renameコマンドでファイル名からアンダースコアを消す方法 5 2023/04/24 13:33
- フリーソフト Windowsの特殊文字を削除や変換したい そんなフリーソフトはありますか? 3 2022/11/09 00:05
- Excel(エクセル) 【マクロ】エラーが発生⇒実行時エラー58既に同名のファイルが存在 5 2022/08/31 10:03
- Excel(エクセル) Excelを開くとエラーが出る 2 2022/10/03 16:13
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
秘密基地、どこに作った?
小さい頃、1度は誰もが作ったであろう秘密基地。 大人の今だからこそ言える、あなたの秘密基地の場所を教えてください!
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
C言語のことです。写真(見にくくてすいません)の下のプログラムを実行したいのですが四行目がおかしいと
C言語・C++・C#
-
今ってプログラミング言語は何が中心?
C言語・C++・C#
-
c++の勉強方法を教えてくださいプログラミングをやった事がなく1から勉強を始めようと思います1日1時
C言語・C++・C#
-
-
4
CPUが16bitでも32bitOSでコンパイルしたコード(例えばintが4バイトと定義されている)
C言語・C++・C#
-
5
逆コンパイルと逆アセンブルの違いはなんですか
C言語・C++・C#
-
6
C# で 数式文字列処理を処理する方法
C言語・C++・C#
-
7
0 == False はいいけど
C言語・C++・C#
-
8
10進数からN進数に変換するプログラミング(C言語)
C言語・C++・C#
-
9
これて逆じゃないですか?
C言語・C++・C#
-
10
プログラミング言語でアプリやゲームweb制作をしようと思っております。色んなプログラミング言語がある
C言語・C++・C#
-
11
プログラミングの課題がわからないので教えていただきたいです。特にサークル関数を定義した後に呼び出す方
C言語・C++・C#
-
12
どうして+3
C言語・C++・C#
-
13
アセンブリ言語について。
その他(プログラミング・Web制作)
-
14
mallocについて
C言語・C++・C#
-
15
c言語
C言語・C++・C#
-
16
プログラミング言語についてc++に空白あると同じ文字を再度繰り返して処理しないといけないので2倍動作
C言語・C++・C#
-
17
プログラム言語について c言語もコードによって機械語に通訳されると知りました。直接機械が通訳しなくて
C言語・C++・C#
-
18
c言語のリダイレクトによる円の描画について
C言語・C++・C#
-
19
至急助けてください!!!あと2時間しかないです! ボタンを押したら0ランプが点灯し、コンマ5秒後に1
その他(プログラミング・Web制作)
-
20
パソコン
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/6】 西暦2100年、小学生のなりたい職業ランキング
- ・ちょっと先の未来クイズ第5問
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DNCL(共テ用プログラミング言語...
-
DNCL(共テ用プログラミング言語...
-
C言語のことです。写真(見にく...
-
Cのプログラムからアクセスでき...
-
C# で 数式文字列処理を処理す...
-
へんな現象
-
システムエンジニアの適正について
-
Cのコンパイルでコメントアウト...
-
MACで動く実行ファイルをWindow...
-
pythonの質問です。
-
QT(C++)の学習方法について
-
略語の読み方について
-
関数ポインタの高速化のメリット
-
プログラミング言語でアプリや...
-
c++の勉強方法を教えてくださ...
-
パソコン
-
今ってプログラミング言語は何...
-
2つほどお聞きしたいことがあり...
-
どうして+3
-
プログラミング言語についてc++...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のことです。写真(見にく...
-
Cのプログラムからアクセスでき...
-
C# で 数式文字列処理を処理す...
-
大量のデータを読み込んで表示...
-
Windows Formアプリからコンソ...
-
c++の勉強方法を教えてくださ...
-
c言語
-
プログラミング言語でアプリや...
-
VisualStudio2022でC言語プログ...
-
gccを行ってもexeファイルが生...
-
【C言語】全角文字の配列を、全...
-
10進数からN進数に変換するプロ...
-
C#でログファイルにファイルパ...
-
逆コンパイルと逆アセンブルの...
-
C言語 1から20までの逆数の和を...
-
C++でデスクトップGUIアプリ開...
-
c#のTLS1.2での通信について
-
写真のプログラムは、1からnま...
-
0 == False はいいけど
-
VisualStudioでC++クラスを追加...
おすすめ情報
いろんなアドバイス感謝です。
それぞれにお礼をしたいところですが、実働アプリを作成くださったNo5さんをベストアンサーにさせていただきます。
おひとりしかベストアンサーだせないのが辛いです。