C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[16]: フォルダ内のファイル名を取得する方法


(過去ログ 35 を表示中)

[トピック内 47 記事 (1 - 20 表示)]  << 0 | 1 | 2 >>

■17488 / inTopicNo.1)  フォルダ内のファイル名を取得する方法
  
□投稿者/ Bosh (1回)-(2008/04/25(Fri) 16:56:00)

分類:[.NET 全般] 

早速質問です。
大文字、小文字問わずstrExtensionの拡張子を持つファイルを取得したいのですが、どうコーディングをしていいか検討がつきません。
下記のようなコーディングをしてみたのですが、この方法だとstrExtensionに".txt"の格納されている場合に".TXT"のファイルが取得できません。
どなたかご指南のほどをお願いいたします。

For Each stFilePath As String In System.IO.Directory.GetFiles("C:\Test\", string.concat("*",strExtension))
stPrompt &= stFilePath & System.Environment.NewLine
Next stFilePath

引用返信 編集キー/
■17491 / inTopicNo.2)  Re[1]: フォルダ内のファイル名を取得する方法
□投稿者/ ネタ好き (153回)-(2008/04/25(Fri) 17:09:43)
No17488 (Bosh さん) に返信
> 早速質問です。
> 大文字、小文字問わずstrExtensionの拡張子を持つファイルを取得したいのですが、どうコーディングをしていいか検討がつきません。
> 下記のようなコーディングをしてみたのですが、この方法だとstrExtensionに".txt"の格納されている場合に".TXT"のファイルが取得できません。
> どなたかご指南のほどをお願いいたします。
>
> For Each stFilePath As String In System.IO.Directory.GetFiles("C:\Test\", string.concat("*",strExtension))
> stPrompt &= stFilePath & System.Environment.NewLine
> Next stFilePath
>

strExtension = ".TXT";
For Each stFilePath As String In System.IO.Directory.GetFiles("C:\Test\", string.concat("*",strExtension))
stPrompt &= stFilePath & System.Environment.NewLine
Next stFilePath

strExtension = ".txt";
For Each stFilePath As String In System.IO.Directory.GetFiles("C:\Test\", string.concat("*",strExtension))
stPrompt &= stFilePath & System.Environment.NewLine
Next stFilePath

が一番簡単な解決法だと思います。
引用返信 編集キー/
■17492 / inTopicNo.3)  Re[2]: フォルダ内のファイル名を取得する方法
□投稿者/ ネタ好き (154回)-(2008/04/25(Fri) 17:15:03)
ちなみに、パスを連結するのならばStringBuilderクラスを使用するべきです。
文字列を大量に連結する場合StrinbBuilderを使用するのがセオリーです。
(理由はパフォーマンス)
引用返信 編集キー/
■17501 / inTopicNo.4)  Re[3]: フォルダ内のファイル名を取得する方法
□投稿者/ 渋木宏明(ひどり) (717回)-(2008/04/25(Fri) 18:15:07)
渋木宏明(ひどり) さんの Web サイト
> ちなみに、パスを連結するのならばStringBuilderクラスを使用するべきです。

パフォーマンス的には劣りそうですが、パス名/ファイル名の操作のために Path.XXX が用意されています。

引用返信 編集キー/
■17503 / inTopicNo.5)  Re[4]: フォルダ内のファイル名を取得する方法
□投稿者/ Ruku (17回)-(2008/04/25(Fri) 18:44:53)
> 下記のようなコーディングをしてみたのですが、この方法だとstrExtensionに".txt"の格納されている場合に".TXT"のファイルが取得できません。

私の環境だと取得できましたが... (.NET Framework 2.0)
引用返信 編集キー/
■17506 / inTopicNo.6)  Re[5]: フォルダ内のファイル名を取得する方法
□投稿者/ 魔界の仮面弁士 (694回)-(2008/04/25(Fri) 19:32:28)
■17488 (Bosh さん) に返信
コードを見る限り、.NET 1.0 や Compact Framework 等では無さそうですね。
とりあえず、.NET 2.0 と仮定しておきます。


No17503 (Ruku さん) に返信
> 私の環境だと取得できましたが... (.NET Framework 2.0)
こちらも同じく取得できました。.NET 2.0、ファイルシステムは NTFS5.1 です。

念のため、Bosh さんに確認しておきたいのですが、txt と txt、TXT と TXTを間違えていたとか、
実はフォルダ内にあったのが file1.TXT ではなく、file1.TXT.lnk だった…という事はないでしょうか。


No17491 (ネタ好き さん) に返信
それだと、TxT とか tXt とか Txt とかの立場が無いかも知れない。(^-^;
# というか、末尾セミコロンが気になる…。
引用返信 編集キー/
■17507 / inTopicNo.7)  Re[6]: フォルダ内のファイル名を取得する方法
□投稿者/ ネタ好き (158回)-(2008/04/25(Fri) 23:27:57)
2008/04/25(Fri) 23:56:40 編集(投稿者)


最近C#ばっかりだったのでセミコロンをつけてしまいましたw
良い子は真似をしないように。
一番いいのは、ファイルオブジェクトを取得して、ファイル名を

dim name as String = file.FullName.ToLower()

にしてから比較する事。ようは比較対象をそろえると言う事です。
数値の場合単位をそろえる様にね。
引用返信 編集キー/
■17517 / inTopicNo.8)  Re[7]: フォルダ内のファイル名を取得する方法
□投稿者/ 魔界の仮面弁士 (695回)-(2008/04/26(Sat) 17:06:24)
No17507 (ネタ好き さん) に返信
> dim name as String = file.FullName.ToLower()
> にしてから比較する事。ようは比較対象をそろえると言う事です。

その実装も問題があるかと。

Windows のファイル名では、ABC と abc は同一視されますが、
ABCとabcは別物として扱われる事になっていますし。
引用返信 編集キー/
■17519 / inTopicNo.9)  Re[8]: フォルダ内のファイル名を取得する方法
□投稿者/ ネタ好き (160回)-(2008/04/26(Sat) 18:41:06)
2008/04/26(Sat) 19:06:13 編集(投稿者)
2008/04/26(Sat) 18:46:47 編集(投稿者)

No17517 (魔界の仮面弁士 さん) に返信
> ■No17507 (ネタ好き さん) に返信
>>dim name as String = file.FullName.ToLower()
>>にしてから比較する事。ようは比較対象をそろえると言う事です。
>
> その実装も問題があるかと。
>
> Windows のファイル名では、ABC と abc は同一視されますが、
> ABCとabcは別物として扱われる事になっていますし。

確かに半角と全角の問題を忘れていました。
とどめにStrConv(fileName, VbStrConv.Narrow)にすればいいんじゃないかな?
これも比較対象をそろえるという事になると思います。
拡張子が比較対象なのでこれで多分大丈夫だと思います。

追記
さらにパフォーマンスを考えると、ファイル名ではなくて、ファイル拡張子を取得して変換&比較するのがベストだと思います。
引用返信 編集キー/
■17529 / inTopicNo.10)  Re[9]: フォルダ内のファイル名を取得する方法
□投稿者/ もんきっき (27回)-(2008/04/26(Sat) 20:12:12)
2008/04/26(Sat) 20:15:29 編集(投稿者)

遅いかもしれませんがいつも使ってる方法です

Dim 拡張子 As String = ".txt"
DIM dir as string = "C:\Test\"
Dim files As List(Of String) = New List(Of String)
For Each Filepath As String In IO.Directory.GetFiles(dir)
If StrComp(IO.Path.GetExtension(Filepath), 拡張子, CompareMethod.Text) = 0 Then
files.Add( Filepath)
End If
next

拡張子の識別なら半角全角の比較はいらないような気がします。

生半可な知識で言ってみますが”.TXT”が取得できないのは
プロジェクトのプロパティでテキストの比較方法の設定が
CompareMethod.binalyになってるからではないでしょうか。

ちなみにパスの連結は
System.IO.Path.Combine ("A", "B")
でやってますが、これって遅いのかな?


引用返信 編集キー/
■17531 / inTopicNo.11)  Re[10]: フォルダ内のファイル名を取得する方法
□投稿者/ 渋木宏明(ひどり) (719回)-(2008/04/26(Sat) 20:36:41)
渋木宏明(ひどり) さんの Web サイト
> 遅いかもしれませんがいつも使ってる方法です
>
> Dim 拡張子 As String = ".txt"
> DIM dir as string = "C:\Test\"
> Dim files As List(Of String) = New List(Of String)
> For Each Filepath As String In IO.Directory.GetFiles(dir)

System.IO.Directory.GetFiles() には、指定された拡張子を持つファイルだけを列挙するオーバーロードが存在します。

「拡張子が .txt であるファイルの一覧の取得」が目的なら、はじめから「拡張子が .txt であるファイルだけを列挙」した方が話が早いと思います。

> ちなみにパスの連結は
> System.IO.Path.Combine ("A", "B")
> でやってますが、これって遅いのかな?

微々たるものです。

StringBuilder が有利なのは、いくつもの文字列を連結するようなケースです。

引用返信 編集キー/
■17532 / inTopicNo.12)  Re[10]: フォルダ内のファイル名を取得する方法
□投稿者/ ネタ好き (163回)-(2008/04/26(Sat) 20:38:50)
2008/04/26(Sat) 20:40:00 編集(投稿者)
No17529 (もんきっき さん) に返信
> 2008/04/26(Sat) 20:15:29 編集(投稿者)
>
> 遅いかもしれませんがいつも使ってる方法です
>
> Dim 拡張子 As String = ".txt"
> DIM dir as string = "C:\Test\"
> Dim files As List(Of String) = New List(Of String)
> For Each Filepath As String In IO.Directory.GetFiles(dir)
> If StrComp(IO.Path.GetExtension(Filepath), 拡張子, CompareMethod.Text) = 0 Then
> files.Add( Filepath)
> End If
> next
>
> 拡張子の識別なら半角全角の比較はいらないような気がします。
>
> 生半可な知識で言ってみますが”.TXT”が取得できないのは
> プロジェクトのプロパティでテキストの比較方法の設定が
> CompareMethod.binalyになってるからではないでしょうか。
>
> ちなみにパスの連結は
> System.IO.Path.Combine ("A", "B")
> でやってますが、これって遅いのかな?

公開されているソースコードを読む限り、単純な文字列処理よりも遅いと思います。
理由1:パスの妥当性を判定している。
理由2:Stringオブジェクトをそのまま使用しているので、余分なオブジェクトが生成される。
理由3:文字列チェック処理がある。
本当はもっと最適化されているかもしれないけど、パスの妥当性を判断している時点で遅いと思います。
メソッド呼び出しのコストがあるしね。
引用返信 編集キー/
■17534 / inTopicNo.13)  Re[11]: フォルダ内のファイル名を取得する方法
□投稿者/ 渋木宏明(ひどり) (720回)-(2008/04/26(Sat) 21:48:20)
渋木宏明(ひどり) さんの Web サイト
> 公開されているソースコードを読む限り、単純な文字列処理よりも遅いと思います。

遅いと言っても実時間にすればごく僅かなものなので、それがボトルネックにでもなっていない限り、ピンポイントで速さを追求してみても大した利は得られないでしょう。

それよりも、パス名のチェックが行われること等による利の方が一般的には多いはずです。

なので、安直に「Path.XXX は遅いから、パス名の操作は文字列処理で行うべきだ」という結論には飛びつかないのが吉です。

引用返信 編集キー/
■17535 / inTopicNo.14)  Re[11]: フォルダ内のファイル名を取得する方法
□投稿者/ ネタ好き (164回)-(2008/04/26(Sat) 22:04:47)
2008/04/26(Sat) 22:35:51 編集(投稿者)
2008/04/26(Sat) 22:35:06 編集(投稿者)

>■17534 (渋木宏明(ひどり) さん) に返信
その意見は一般的には正しいと思いますが、今回の場合Directory.GetFilesでは、
もともと存在しないパスのファイルは返されないはずです。
ですから、この場面ではPath.Combineは無駄な動きが多すぎると思います。
Path.Combineが活躍するのは新規にファイルを作成する時だと思います。
引用返信 編集キー/
■17550 / inTopicNo.15)  Re[12]: フォルダ内のファイル名を取得する方法
□投稿者/ もんきっき (28回)-(2008/04/27(Sun) 00:53:25)
ひどり様

>System.IO.Directory.GetFiles() には、指定された拡張子を持つファイルだけを列挙するオーバーロードが存在します。

私も書きながら思っていました。
普段はこう使っています

Dim 拡張子s As String() = {".txt","xls"}
Dim 拡張子 As String
DIM dir as string = "C:\Test\"
Dim files As List(Of String) = New List(Of String)
For Each Filepath As String In IO.Directory.GetFiles(dir)
for each 拡張子 as string in 拡張子s
If StrComp(IO.Path.GetExtension(Filepath), 拡張子, CompareMethod.Text) = 0 Then
files.Add( Filepath)
End If
next
next

確か複数の拡張子を取得することができなかったと思います
複数の拡張子のファイルを列挙するスマートな方法はありますでしょうか。
引用返信 編集キー/
■17553 / inTopicNo.16)  Re[13]: フォルダ内のファイル名を取得する方法
□投稿者/ 渋木宏明(ひどり) (722回)-(2008/04/27(Sun) 01:27:40)
渋木宏明(ひどり) さんの Web サイト
> Dim 拡張子s As String() = {".txt","xls"}

> If StrComp(IO.Path.GetExtension(Filepath), 拡張子, CompareMethod.Text) = 0 Then

これだと、拡張子が .TXT なファイルがひっかからないんじゃないですか?

> 確か複数の拡張子を取得することができなかったと思います
> 複数の拡張子のファイルを列挙するスマートな方法はありますでしょうか。

無いですね。追加してほしいような気はします。

引用返信 編集キー/
■17554 / inTopicNo.17)  Re[13]: フォルダ内のファイル名を取得する方法
□投稿者/ ま (23回)-(2008/04/27(Sun) 01:49:05)
> If StrComp(IO.Path.GetExtension(Filepath), 拡張子, CompareMethod.Text) = 0 Then
> files.Add( Filepath)
> End If

十分スマートに見えますが・・・ループの深いとこで当たるファイルが10000件くらい
あると若干スピード差が出てくるかもしれませんが、マップもループも大して変わらないで
すよ。

public function GetFiles(dir as String, exts() as String) as List
  dim map as new HashMap()
  dim lst as new ArrayList()

  for i as integer = 0 to exts.Count - 1
     map.add(exts(i).toLowerCase(), true)
  next

  for each name as String in GetFiles(dir)
     try
        dim ext as String = name.substring(name.lastIndexOf(".") + 1)
        if map.get(ext.toLowerCase()) then
           lst.add(name)
        end if
     catch e as Exception
     end try
  next
  return lst
end function

dim lst as List = GetFiles("C:\xxxx", new String() { "TXT", "BAS", "VBS", "SLN", "JAVA" })   


GetFiles って、ExtensionFilter がありませんでしたっけ?

便乗質問は別スレッドが基本です。
たぶん。

引用返信 編集キー/
■17560 / inTopicNo.18)  Re[14]: フォルダ内のファイル名を取得する方法
□投稿者/ れい (509回)-(2008/04/27(Sun) 09:41:10)
Windowsだから拡張子の大文字小文字は区別されない、
っていうことはないです。

ファイルシステムに依ります。
LowerCaseとかで比較していいのかも、ファイルシステム次第。

Win32APIのFindXXXとか使うのが確実です。

将来のこととか考えたら
GetFilesがいいと思います。

引用返信 編集キー/
■17562 / inTopicNo.19)  Re[14]: フォルダ内のファイル名を取得する方法
□投稿者/ もんきっき (29回)-(2008/04/27(Sun) 09:58:23)
>>Dim 拡張子s As String() = {".txt","xls"}
>>If StrComp(IO.Path.GetExtension(Filepath), 拡張子, CompareMethod.Text) = 0 Then
> これだと、拡張子が .TXT なファイルがひっかからないんじゃないですか?

CompareMethod.binaly ならひっかかりませんが
CompareMethod.Text ならひっかかります。


引用返信 編集キー/
■17570 / inTopicNo.20)  Re[14]: フォルダ内のファイル名を取得する方法
 
□投稿者/ 渋木宏明(ひどり) (724回)-(2008/04/27(Sun) 14:25:11)
渋木宏明(ひどり) さんの Web サイト
> GetFiles って、ExtensionFilter がありませんでしたっけ?

ありますが、複数の拡張子に対応していません。

拡張子の数だけ GetFiles() するよりは、1回だけ GetFiles() してから拡張子を見て選別する方が I/O の回数が少なくなるので効率的です。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 | 2 >>

管理者用

- Child Tree -