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

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

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

Re[4]: VB2005の「DIR」関数について


(過去ログ 91 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■54423 / inTopicNo.1)  VB2005の「DIR」関数について
  
□投稿者/ uooono (12回)-(2010/10/19(Tue) 17:34:30)

分類:[VB.NET/VB2005 以降] 

2010/10/19(Tue) 17:35:16 編集(投稿者)

現在VB6.0からVB2005へコンバージョンを行っています。
DIR関数の自動コンバージョンの結果
「Dir に新しい動作が指定されています。」という警告が出ていました。詳しく見てみると以下のような記述がありました。

>Visual Basic 6.0 では、ファイル、フォルダ、またはディレクトリの名前を返すために Dir 関数を使用します。パス引数で "." および ".." 文字列を使用すると、
>現在のディレクトリと 1 つ上の階層のディレクトリを表すことができます。
>Visual Basic 2005 では、Dir 関数は基本的に同じですが、"." および ".." 構文の動作が異なります。

3行目の「"." および ".." 構文の動作が異なります。」について、どのように違うのか調べれませんでした。

どなたかご存知の方教えていただきたいと思います。
引用返信 編集キー/
■54424 / inTopicNo.2)  Re[1]: VB2005の「DIR」関数について
□投稿者/ 魔界の仮面弁士 (1876回)-(2010/10/19(Tue) 19:05:12)
2010/10/19(Tue) 19:24:54 編集(投稿者)

No54423 (uooono さん) に返信
> 3行目の「"." および ".." 構文の動作が異なります。」について、どのように違うのか調べれませんでした。

オンライン版でいうと、下記のページですよね。
Dir 関数の項にある「次の操作」という項目で説明されていますよ。
http://msdn.microsoft.com/ja-jp/library/185c80s9%28VS.80%29.aspx

具体例を出せば、
 s = Dir("C:\A\01\*", vbDirectory) '(ルート以外に対する)ディレクトリ列挙
 Do Until s = ""
  Call MsgBox(s)
  s = Dir()
 Loop
のようなコードを実行した場合、VB6 では "." や ".." が列挙されるのに対し、
VB2005 では "." や ".." が返されない、という事です。
(この動作は、FindFirstFile API の仕様によるものです)

それゆえ VB6 で Dir を使う場合、「列挙結果に "." や ".." が現れたらば、それらを読み捨てる」
という記述が行われる事が多かったかと思います。また、そのように実装されたコードであれば、
2005 にコンバートした際にも、特に問題は生じません。

しかしこれを「列挙結果の先頭 2 つを読み捨てる」という方法で実装しているとしたら、
VB2005 にコンバートされたコードでは問題が発生する事になります。
引用返信 編集キー/
■54438 / inTopicNo.3)  Re[2]: VB2005の「DIR」関数について
□投稿者/ uooono (13回)-(2010/10/20(Wed) 09:28:53)
No54424 (魔界の仮面弁士 さん) に返信
> それゆえ VB6 で Dir を使う場合、「列挙結果に "." や ".." が現れたらば、それらを読み捨てる」
> という記述が行われる事が多かったかと思います。また、そのように実装されたコードであれば、
> 2005 にコンバートした際にも、特に問題は生じません。
>
> しかしこれを「列挙結果の先頭 2 つを読み捨てる」という方法で実装しているとしたら、
> VB2005 にコンバートされたコードでは問題が発生する事になります。

回答ありがとうございます!
サンプルプログラムを実行してみて、意味が理解できました。

以下のような分岐処理のコンバージョンをしていたのですが、自動コンバート結果のままで問題ないということですね。
(vb6.0)
If Dir("C:\test\aaa.txt", vbNormal) = "" Then
(vb2005自動コンバート結果)
If Dir("C:\test\aaa.txt", FileAttribute.Normal) = "" Then

解決済み
引用返信 編集キー/
■54440 / inTopicNo.4)  Re[3]: VB2005の「DIR」関数について
□投稿者/ 魔界の仮面弁士 (1878回)-(2010/10/20(Wed) 09:51:02)
No54438 (uooono さん) に返信
> 以下のような分岐処理のコンバージョンをしていたのですが、
C:\test\aaa.txt というファイルの存在確認を行っているのだと思いますが、
ファイルの存在確認であれば、Dir 関数を使うのではなく、
System.IO.File.Exists メソッドや System.IO.Directory.Exists メソッドに
切り替えるようにしてみてください。


> If Dir("C:\test\aaa.txt", vbNormal) = "" Then
> If Dir("C:\test\aaa.txt", FileAttribute.Normal) = "" Then
本当にこのコードで問題ありませんか? (VB6版も含めて)

上記の場合、それが隠しファイル属性やシステムファイル属性付のものだった場合に
存在を検出できない事に注意してください(Normal が指定されているため)。
その意味でも、先の Exists メソッドを利用した方がスマートかと。


ついでに言えば、C:\test\aaa.txt という「ファイル」は存在していなかったけれども、
C:\test\aaa.txt という「ディレクトリ」が存在していたという可能性もありえます。
しかし、これらのコードではそこまでは検出していないようですね。
引用返信 編集キー/
■54442 / inTopicNo.5)  Re[4]: VB2005の「DIR」関数について
□投稿者/ uooono (15回)-(2010/10/20(Wed) 10:16:07)
No54440 (魔界の仮面弁士 さん) に返信

>>If Dir("C:\test\aaa.txt", vbNormal) = "" Then
>>If Dir("C:\test\aaa.txt", FileAttribute.Normal) = "" Then
> 本当にこのコードで問題ありませんか? (VB6版も含めて)
>
> 上記の場合、それが隠しファイル属性やシステムファイル属性付のものだった場合に
> 存在を検出できない事に注意してください(Normal が指定されているため)。
> その意味でも、先の Exists メソッドを利用した方がスマートかと。

> ついでに言えば、C:\test\aaa.txt という「ファイル」は存在していなかったけれども、
> C:\test\aaa.txt という「ディレクトリ」が存在していたという可能性もありえます。
> しかし、これらのコードではそこまでは検出していないようですね。

確かに本来は、Existsメソッドを利用したほうがよさそうに思います。
今回はVB6.0のコードと同等の機能をVB2005へコンバートするという仕様ですので、DIRのままのコンバートとしようと思います。
大変勉強になりました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -