
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も見ています
-
今年はじめたいことは?
今年はこれをはじめたい!ということを教えてください!
-
おすすめの美術館・博物館、教えてください!
美術館・博物館が大好きです。みなさんのおすすめをぜひお聞きしたいです。
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
今から楽しみな予定はありますか?
いよいよ2025年が始まりました。皆さんには、今から楽しみにしている予定はありますか?
-
C言語のことです。写真(見にくくてすいません)の下のプログラムを実行したいのですが四行目がおかしいと
C言語・C++・C#
-
CPUが16bitでも32bitOSでコンパイルしたコード(例えばintが4バイトと定義されている)
C言語・C++・C#
-
逆コンパイルと逆アセンブルの違いはなんですか
C言語・C++・C#
-
-
4
今ってプログラミング言語は何が中心?
C言語・C++・C#
-
5
c++の勉強方法を教えてくださいプログラミングをやった事がなく1から勉強を始めようと思います1日1時
C言語・C++・C#
-
6
10進数からN進数に変換するプログラミング(C言語)
C言語・C++・C#
-
7
0 == False はいいけど
C言語・C++・C#
-
8
C# で 数式文字列処理を処理する方法
C言語・C++・C#
-
9
C言語 関数、変数の宣言について
C言語・C++・C#
-
10
これて逆じゃないですか?
C言語・C++・C#
-
11
どうして+3
C言語・C++・C#
-
12
プログラミング言語でアプリやゲームweb制作をしようと思っております。色んなプログラミング言語がある
C言語・C++・C#
-
13
あってる
C言語・C++・C#
-
14
DNCL(共テ用プログラミング言語)について 写真の(12)のプログラムにおいて、解説によると(12
C言語・C++・C#
-
15
プログラム言語について c言語もコードによって機械語に通訳されると知りました。直接機械が通訳しなくて
C言語・C++・C#
-
16
アセンブリ言語について。
その他(プログラミング・Web制作)
-
17
c言語
C言語・C++・C#
-
18
c言語のリダイレクトによる円の描画について
C言語・C++・C#
-
19
プログラミング言語についてc++に空白あると同じ文字を再度繰り返して処理しないといけないので2倍動作
C言語・C++・C#
-
20
パソコン
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラマー達は何故、プログ...
-
C#でログファイルにファイルパ...
-
C言語 関数、変数の宣言について
-
逆コンパイルと逆アセンブルの...
-
C言語について(初心者)
-
VisualStudio2022でC言語プログ...
-
Windows Formアプリからコンソ...
-
大量のデータを読み込んで表示...
-
VisualStudioでC++クラスを追加...
-
最初に聞かれたこと
-
C#でTreeViewのCheckBoxのサイ...
-
PIC12F1822でLED調光器を作りたい
-
C言語 バッファについて。
-
【C言語】全角文字の配列を、全...
-
あってる
-
Notepad++の関数リスト表示でC...
-
VisualStudioで、コードを印刷...
-
QT(C++)の学習方法について
-
c言語の問題です
-
いまc言語の標準ライブラリ文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 関数、変数の宣言について
-
C言語について(初心者)
-
最初に聞かれたこと
-
大量のデータを読み込んで表示...
-
Windows Formアプリからコンソ...
-
PIC12F1822でLED調光器を作りたい
-
C#でログファイルにファイルパ...
-
c言語
-
プログラミングc++を全く分か...
-
C++でデスクトップGUIアプリ開...
-
【C言語】全角文字の配列を、全...
-
gccを行ってもexeファイルが生...
-
VisualStudio2022でC言語プログ...
-
C#でTreeViewのCheckBoxのサイ...
-
C言語の質問です。バイナリ形...
-
VisualStudioでC++クラスを追加...
-
逆コンパイルと逆アセンブルの...
-
int16_t の _t は何?
-
c#のTLS1.2での通信について
-
バッチファイルで以下のような...
おすすめ情報
いろんなアドバイス感謝です。
それぞれにお礼をしたいところですが、実働アプリを作成くださったNo5さんをベストアンサーにさせていただきます。
おひとりしかベストアンサーだせないのが辛いです。