質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

6回答

7567閲覧

C#で日本語を含むファイル名の処理方法

tonton333

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2020/01/17 02:11

編集2020/01/17 06:42

C#でStreamWriterを用いてファイルを保存したいのですが、このときファイル名に日本語が含まれると
「パスに無効な文字が含まれています」とでます
C++では一旦ダミーパスで保存してからsystemでrenコマンドを送信して対処していましたが
1.そもそも日本語を含むパスを扱う方法はありますでしょうか?

2.ない場合、よい対処方法があれば教えてください

よろしくお願いします

C#

1using (StreamWriter sw1 = new StreamWriter(fileName, false, 2 System.Text.Encoding.GetEncoding("shift_jis"))) 3//fileNameが日本語を含んでいると失敗

申し訳ございません重要な事実を書き忘れていました
エクセルのセル内で改行されているものを、

C#

1fileName = wb.Cell(7, column).GetString().Replace("\n", "_").Trim(' ') + "拡張子(実際は.~という表記)"

と置き換えています
このときのfileNameが
System.IO.Path.GetDirectoryName(fileName)した結果
DIRECTORY\ファイル名.~
のように、ディレクトリとファイル名がつながってします
※改行していないセルの場合はディレクトリだけが表示される

コンソールに出力された結果を見る限り特殊文字などは見当たらないのですが、何か可能性はありますでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

testset

2020/01/17 02:44

具体的なファイル名(fileName変数の中身)が分からないと答えられませんので、開示いただくことは可能でしょうか。
tonton333

2020/01/17 02:51

ファイル名は開示できないのですが、ClosedXMLを用いてエクセルのセル内で改行されたセルを読み込んでファイル名としています(ディレクトリは実行フォルダ) 日本語の方が問題かもしれません System.IO.Path.GetDirectoryName(fileName)を使うと改行を含む場合だけ返り値がディレクトリ+フォルダ名となってしまっていました
tamoto

2020/01/17 07:07

CR が混入していませんか?
guest

回答6

0

解決済みになっていますが…

Office TANAKA セル内の改行コードに注意

こちらを見ると、

入力される改行コードは0A(LF)です。

とあります

質問のコメントで「ClosedXML」を使用しているとあります(こういう情報を質問に追記してください)ので、取得結果が「0A(LF)」のままの場合は質問文の置換処理で「_」に置き換えられると思いますが、WindowsやC#での一般的な「0D 0A(CRLF)」に変換して取得されている場合は「0D(CR)」が残ってしまうと思います

投稿2020/01/17 13:25

len_souko

総合スコア1337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

パス名に使用できない文字は System.IO.Path.GetInvalidPathChars() で取得できるので

C#

1static HashSet<char> InvalidChars = new HashSet<char>(System.IO.Path.GetInvalidPathChars()); 2 3public static string ToValidCharFileName(string fileName) { 4 var sb = new System.Text.StringBuilder(); 5 foreach (var c in fileName) { 6 if (!InvalidChars.Contains(c)) { 7 sb.Append(c); 8 } else { 9 sb.Append('_'); 10 System.Diagnostics.Debug.Print("{0:X4}", (int)c); 11 } 12 } 13 return sb.ToString(); 14}

こんな関数を作ってファイル名を修正してみては?

投稿2020/01/17 06:59

KOZ6.0

総合スコア2622

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tonton333

2020/01/17 07:58

どの方にするか悩みましたが関数を貼っていただいたのでBAに決めました CRかどうかまで調べていませんがコンソールに出力されない特殊文字が混じってたみたいです ありがとうございました
guest

0

>改行されたセルを読み込んでファイル名としています
とコメントされてますので、
ファイル名が

C#

1string filename = "C:\テストフォルダ\" + Environment.NewLine + "テストファイル.txt";

みたいなことになっているのではないですか?

投稿2020/01/17 03:31

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

セル内で改行されたセルを読み込んでファイル名としています

改行コードはディレクトリ名・ファイル名には含めることはできません。

投稿2020/01/17 03:29

Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

このときファイル名に日本語が含まれると「パスに無効な文字が含まれています」とでます

日本語は問題ないです。

以下と同じ例外では? であればファイル名として使えない文字(下の画像の例では *)がファイル名に含まれているからでしょう。ちなみに、ファイル名から * を削除すればエラーにはなりません。

イメージ説明

投稿2020/01/17 03:26

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

日本語が含まれていても、ふつーに処理できるはずですが、
エラーが出るということは、そのファイル名がなんかおかしいということなんでしょう。

いろいろあがく前に、そのファイル名を表示させるなりしてなにが異常なのかを確認しましょうよ

投稿2020/01/17 02:14

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問