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

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

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

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

Q&A

解決済

2回答

9332閲覧

C# 入力されたパスがテキストファイルかどうかを判定したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

1クリップ

投稿2017/05/14 08:21

編集2017/05/15 13:32

C#のwindows formでユーザーにテキストファイルのパスを入力してもらい、
テキストファイルをコピーするプログラムを作りたいです。
ファイルコピーをする上で入力したファイルが存在しないなどの起こり得るエラーはif文で書きたいと思っています。

そこで質問なのですが、
入力された文字がテキストファイルであるかどうかを判定する関数などはあるのでしょうか?

現在開発環境がないので、ソースコードを書くことができません。

回答のほど、よろしくお願いします。

///追記

EndsWithを使ってすることは可能でしょうか?
if (入力された文字を格納した変数.EndsWith(".txt"))
{
///trueの場合の処理
}

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

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

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

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

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

guest

回答2

0

ファイル名の拡張子がtxtのものだけが対象で良いのであれば、追記にご記載の方法で良いかと思います。
※大文字の".TXT"なども対象にしたほうが良いかと思いますので、EndsWithの2番目の引数に StringComparison.CurrentCultureIgnoreCase などを指定したほうがいいです。

拡張子が何であっても中身がテキストのファイルをすべて対象とするということであれば、実際にファイルを開いてみて読めるかどうか確認する必要があるかと思います。
下記リンク先の「ファイルはテキストファイルであるかどうか」のほうをご参照ください。

+C#+バイナリ・テキストファイルの判断


※追記

上記リンク先の内容についての指摘がありますので、コメント欄もあわせてご確認ください。

投稿2017/05/14 08:48

編集2017/05/14 23:50
oika

総合スコア425

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

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

退会済みユーザー

退会済みユーザー

2017/05/14 09:05

回答ありがとうございます。 大文字の場合は考えていなかったので参考になります。 リンク先の方法も見てみたのですが、テキストファイルであるかどうかの判断は、 .txt .asc .sjisが対象という解釈で良いのでしょうか?
oika

2017/05/14 10:02

>.txt .asc .sjisが対象という解釈で良いのでしょうか? ↑は拡張子の話ですか?どこかにそんな記述ありました?? 何をもってそのファイルがテキストファイルであると見なすかというのは難しい話だと思いますが、リンク先の方法は、簡易的に「0」のバイトがあったらテキストではないと見なしましょうという方法ですね。 あとはそのソフトウェアの使い道次第ですが、もっと厳密にやるなら、全バイトが特定の文字コード範囲内かどうかを調べることになるでしょうか。 ついでに補足ですが、リンク先のコードはFileStreamをCloseしてないのでご注意ください。
Zuishin

2017/05/14 11:14

リンク先のコードですが、ひどすぎます。もうちょっとマシなのを紹介してあげてください。
oika

2017/05/14 14:34

そう思われるのでしたら、「探してみてください」じゃなくて、是非とも貴方がご紹介してあげてください。 また「ひどすぎます」だけでは質問者様にとってもモヤモヤだけが残ってしまいますので、このコードではなぜダメかという点をあわせてご教示いただけると幸いです。
Zuishin

2017/05/14 16:00

まずファイルを開いたまま閉じてない。論外です。 テキストファイルかどうかを判定する関数とバイナリファイルかどうかを判定する関数の二種類がある。無意味です。 さらにどちらからも false と判定されるファイルがある。呆れ果てます。 判定方法が酷すぎる。0 が四連続でバイナリファイル。まったく意味がわかりません。 先頭バイトが 0 でなければテキストファイル。開いた口が塞がりません。 実際に読んでみての言葉ですか?
honami

2017/05/14 16:10

そもそもコードが良いものであるか、という以前に、解答における「リンク」とは補足の意味合いで留めておくべきだと思います。 このサイトでの解答は、今まさに質問している人ためだけのものでなく、将来的に同じ問題を抱えた人が読む可能性があります。 リンク先が将来404エラーを出さないことを保証できない限り、参照だけでなく例としてソースをきちんと提示することは最低限のことであるように思います。
oika

2017/05/14 23:48

>まずファイルを開いたまま閉じてない。論外です。 この点は後から気づいて補足させていただきました。 >テキストファイルかどうかを判定する関数とバイナリファイルかどうかを判定する関数の二種類がある。無意味です。 バイナリのほうの判定は不要だと思ったので、テキストファイルの判定のほうをご参照くださいと記述したつもりでした。 (言葉足らずで不親切でしたね…) >判定方法が酷すぎる。0 が四連続でバイナリファイル。まったく意味がわかりません。 これはバイナリのほうですね。 >先頭バイトが 0 でなければテキストファイル。開いた口が塞がりません。 この点は誤読じゃないですか? 先頭から0が見つかるまで読み進めているようです。 --- まずはリンク先をそのまま鵜呑みにするのは問題ありそうということで、回答の本文中にもこのコメントを参照のことと注記しておきます。
Zuishin

2017/05/15 00:05

先頭バイトは誤読でしたね。もう目を覆っていたのでしょう。 しかし、どちらにしてもひどいアルゴリズムです。 ファイルをバッファリングせず 1 バイトずつ全部読み込んで 0 が見つかるまで検索するとか、マゾかと思います。
Zuishin

2017/05/15 00:14

また、このアルゴリズムで utf16 テキストを判定してみてください。テキストではないと判定されます。 utf16 はごく一般的なエンコーディングです。
退会済みユーザー

退会済みユーザー

2017/05/15 13:35

みなさん、回答ありがとうございます。 初めての投稿、C#初心者なのでいろいろと勉強になりました。
guest

0

ベストアンサー

標準ではありません。どこかにありますが、手元に情報がないので省きます。探してみてください。

投稿2017/05/14 08:23

Zuishin

総合スコア28660

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

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

退会済みユーザー

退会済みユーザー

2017/05/14 08:38

やはり標準ではないのですね。 回答ありがとうございます。
Zuishin

2017/05/14 09:40

中身がどうあれ拡張子だけで判断するのであれば、思いつく限り選んだ「これがテキストだろう」という拡張子をテキストと判断するか、https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7 から text を検索してヒットしたものをテキストファイルとみなすか、レジストリの HKCR からその拡張子のキーを開き、ContentType を探すかしてください。 中を見て判定するのであれば、エンコーディングの自動判別ライブラリを探してください。一口にテキストと言っても様々なエンコーディングがありますから、それらに対応したものでないと役に立ちません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問