ネットが遅くてイライラしてない!?

VB.NETで、あるフォルダ内のファイルをファイル名順に読む方法を教えてください。
ちなみに、現在は、以下のような処理をしています。

fs = CreateObject("Scripting.FileSystemObject")
f = fs.GetFolder(strDirPath)
fc = f.Files

For Each f1 In fc



Next

ご回答、よろしくお願いします。

A 回答 (3件)

たしかOSのバージョンによって動きが違う部分だったと思います。


やっぱり手動でソートしたほうが確実です。
    • good
    • 0

経験的には、.Files でファイル名順になっているような気がします。


そうならないような場合は、自前でソートする必要があると思います。
    • good
    • 0
この回答へのお礼

いろいろ、テストしてみましたが、
.Files でも、GetFilesでもファイル名でソートされているみたいですね。
一応、念のため、

Dim fileList As String() = System.IO.Directory.GetFiles(strDirPath)
Array.Sort(fileList)

で明示的にソートをかけておこうと思います。

お礼日時:2006/04/25 14:52

お世話になります。



Dim fileList As String() = System.IO.Directory.GetFiles("D:\Test")
For Each fileName As String In fileList
  Console.WriteLine(fileName)
Next

ですかね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSystem.IO.Directory.GetFilesの順番

For Each strFileName As String In Directory.GetFiles("フォルダ名","*.TXT")
'なにか処理
Next strFileName


としてファイル名を読み込んで処理する場合、ファイル名でソートされて順番に出てくるような気がします。
どのような基準でソートされるのかを調べているのですが、はっきり明記されているものが見つかりません。

安心して使うために裏付けがほしいのですが、どこかに詳細な資料はないでしょうか?
よろしくお願いします。

Aベストアンサー

内部的に FindFirstFile / FindNextFile を使っているようだけど
http://www.microsoft.com/japan/msdn/net/general/win32map.asp

取得する順番は..
http://forums.belution.com/ja/vc/000/038/23.shtml

なるほど!

正式情報は
http://msdn.microsoft.com/library/en-us/fileio/fs/findnextfile.asp

The order in which this function returns the file names is dependent on the file system type. With the NTFS file system and CDFS file systems, the names are returned in alphabetical order. With FAT file systems, the names are returned in the order the files were written to the disk, which may or may not be in alphabetical order.

内部的に FindFirstFile / FindNextFile を使っているようだけど
http://www.microsoft.com/japan/msdn/net/general/win32map.asp

取得する順番は..
http://forums.belution.com/ja/vc/000/038/23.shtml

なるほど!

正式情報は
http://msdn.microsoft.com/library/en-us/fileio/fs/findnextfile.asp

The order in which this function returns the file names is dependent on the file system type. With the NTFS file system and CDFS file systems, the names are returned in alphabetical or...続きを読む

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

Qフォルダの中の特定のファイルを取得

(VB.NET)
Dim files As String() = System.IO.Directory.GetFiles("C:\aaa", "*", System.IO.SearchOption.AllDirectories)
ListBox1.Items.AddRange(files)

上記のコードでは"C:\aaa"以下のすべてのファイルを取得しますが、
例えばGetFilesメソッドの2番目のパラメータに
"*.(html|htm)"などと指定して(この場合は無理でしたが)"C:\aaa"以下の拡張子が「html」または「htm」のファイルを取得するにはどうすればよいでしょうか。
"*.html"のように1種類の場合はできるのですが…。

Aベストアンサー

GetFilesで取得した配列を独自に処理してやればいいのでは

for each ss as string in files
  dim fi as new IO.FileInfo(ss)
  dim ext as String = fi.Extention.ToLower
  ' このextとの比較を工夫すれば別の種類のファイルでも対処可能
  if ext = ".html" or ext = ".htm" then
    ListBox1.Items.add( ss )
  end if
next

といった具合で ...

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

Qフォルダ内の、最新のタイムスタンプのファイルを1つだけ取り出す(VBscript)

フォルダ内に複数のファイルが存在しており、その中でタイムスタンプが一番最新のファイルをコピーしたいと考えているのですが、ファイル同士のタイムスタンプを比較する方法が見つけられませんでした。どなたかご存知の方がいらっしゃいましたら、教えて頂けませんか?

Aベストアンサー

私が書いたスクリプトの後ろにkhaii21さんが書き足されたんですよね?

不思議ですねぇ。本当に書かれたものそのままなら、
>strNewFileName2 = objFile.Name

この行通るはず無いんですけど。
strNewFileName2、空のままのはずです。

通らない理由は、
>If dtmMostNewTimeStamp < objFile.DateLastModified Then

です。dtmMostNewTimeStampより新しいファイル、strNewFileName以外であるわけ無いですよね。


と、khaii21さんが書かれたスクリプトについて解説してみましたが、2番目に新しいファイルを見つけるのに列挙しなおす必要なんて無いですよ(^^;;;


私が書いたスクリプト、ちょっと直すだけで1番目と2番目両方取れます。

Dim strNewFileName
Dim dtmMostNewTimeStamp

Dim strNewFileName2
Dim dtmMostNewTimeStamp2

'ファイルを列挙
For Each objFile In objFolder.Files

If dtmMostNewTimeStamp < objFile.DateLastModified Then

dtmMostNewTimeStamp2 = dtmMostNewTimeStamp
strNewFileName2 = strNewFileName

dtmMostNewTimeStamp = objFile.DateLastModified
strNewFileName = objFile.Name

ElseIf dtmMostNewTimeStamp2 < objFile.DateLastModified Then

dtmMostNewTimeStamp2 = objFile.DateLastModified
strNewFileName2 = objFile.Name

End If

Next

考え方は、列挙したファイルが今までで一番新しかったら
・前の1番目→2番目
・列挙されたファイル→1番目
に、

1番目より古いけど、それまでの2番目よりは新しければ、

・前の1番目→そのまま1番目
・列挙されたファイル→2番目

になりますよね。

私が書いたスクリプトの後ろにkhaii21さんが書き足されたんですよね?

不思議ですねぇ。本当に書かれたものそのままなら、
>strNewFileName2 = objFile.Name

この行通るはず無いんですけど。
strNewFileName2、空のままのはずです。

通らない理由は、
>If dtmMostNewTimeStamp < objFile.DateLastModified Then

です。dtmMostNewTimeStampより新しいファイル、strNewFileName以外であるわけ無いですよね。


と、khaii21さんが書かれたスクリプトについて解説してみましたが、2番目に新しいファ...続きを読む

QVB.NETで他のEXEを実行させる

VB.NETで他のEXEを実行させる以下の2つの方法が知りたいです。

1)perlのsystemのように実行完了後に制御が戻る

2)perlのexecのように実行完了後に制御が戻らない

あと、この2つの使い分けのコツ(用途)が知りたいです。

Aベストアンサー

http://jeanne.wankuma.com/tips/vb.net/process/
こちらの8番と9番をどうぞ。

使い分けですが、
実行完了を待って次の処理をする必要がある場合は、制御が戻るまで待つ、そうでないものはキックして終わり、です。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QVB.NETのコンボボックスについて

VB6からVB.NETでプログラミングを始めました。
コンボボックスのクリアの仕方や設定の仕方、また
取り出し方等を教えて下さい。

色々とヘルプも見てみたのですが、よく解りません。
宜しくお願い致します。

Aベストアンサー

クリアだけだと思ってました。
追記します。

Itemを操作します


'登録
For i = 1 To 10
  Me.ComboBox1.Items.Add(i.ToString)
Next

'取得
For i = 0 To Me.ComboBox1.Items.Count - 1
  MsgBox(Me.ComboBox1.Items(i).ToString)
Next

'完全クリア
Me.ComboBox1.Items.Clear()

部分クリア
Me.ComboBox1.Items.RemoveAt(Index値)

Q文字列の後ろから必要分だけ削除したい。

例1 Dim str As String = "あいうえお1234"

文字列の中の1234だけ削除したい場合は、
str = str.Remove(5,4)
という風に、5文字目の後から4文字削除にすればよいのですが、

例の"あいうえお"の部分の長さが毎回処理する度に異なる場合は、
文字列の頭から何文字目という指定ができないので、”後ろから4文字を削除したい”となります。その場合は、どのようなプロパティを使えばいいのでしょうか。

.NET環境です。

Aベストアンサー

Length(str)で文字数を取得できますので、後ろから4文字目は先頭から何文字目かは計算できると思いますが、どうでしょうか?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング