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

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

新規登録して質問してみよう
ただいま回答率
85.35%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

5回答

7333閲覧

VB.net system.io.file.existsでファイルが検出できない

mizu_guchi

総合スコア9

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/08/12 08:53

前提・実現したいこと

VB.net system.io.file.existsでファイルが検出できない

発生している問題・エラーメッセージ

VB.netでタイマーでsystem.io.file.existsを使い監視しファイルがあれば処理をするといったプログラムを作成しています。 If System.IO.File.Exists("A.txt") Then '処理 Else End If プログラムを起動後に A.txt を配置した場合、ファイルが存在するにもかかわらずfalseが返ってきます。 プログラムを起動後に作成されたA.txtの存在を検知するにはどのようよすればよいでしょうか? ちなみに、プログラムを再起動すると True が返ってきてねらい通りの処理が行えます。

該当のソースコード

VB.net

1If System.IO.File.Exists("A.txt") Then 2 '処理 3Else 4 5End If

試したこと

System.IO.File.ExistsのかわりにSystem.IO.FileInfoを使っても結果は同じでした。

補足情報(FW/ツールのバージョンなど)

ツールバージョン Visual Studio Express 2013 for Windows Desktop
フレームワークバージョン .NET Framework4.5

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/08/14 12:28

質問者さん、無言ですが、回答がいくつか出ているのでそれらに対するフィードバックを書こう。役に立った、立たなかったぐらいはすぐ返せるのでは? 役に立たなかったならどこがダメだったのかを書くとより期待する回答に近いものが出てくるかも。とにかく無言は NG です。
guest

回答5

0

ベストアンサー

質問に提示してるコードだけでは現象は確認出来ません。

vbnet

1If System.IO.File.Exists("A.txt") Then 2 '処理 3Else

ここでどういった処理を行っているかは知りませんが、カレントディレクトリが変更されていたりはしませんか?ファイルを相対パスで指定してるなら、カレントディレクトリ内のファイルを判定する事になります。System.IO.File.ExistsがFalseになっている時のカレントディレクトリを、Directory.GetCurrentDirectory()で確認してみてください。

例えば、下記のようなコードを書くとEXEと同じフォルダにA.txtを置いていてもButton1をクリックした後はFile.Existsの結果はFalseになります。

vbnet

1Imports System.IO 2 3Public Class Form1 4 Protected Overrides Sub OnLoad(e As EventArgs) 5 MyBase.OnLoad(e) 6 7 Timer1.Interval = 1000 8 Timer1.Start() 9 End Sub 10 11 Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 12 Debug.WriteLine($"{Now} {File.Exists("A.txt")}") 13 End Sub 14 15 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 16 Debug.WriteLine("Button1 Clicked") 17 '一個上にカレントディレクトリを移動 18 Directory.SetCurrentDirectory("..") 19 End Sub 20End Class

(出力結果)
2021/08/14 11:18:17 True
2021/08/14 11:18:18 True
2021/08/14 11:18:19 True
Button1 Clicked
2021/08/14 11:18:20 False
2021/08/14 11:18:21 False
2021/08/14 11:18:22 False

投稿2021/08/14 02:19

編集2021/08/14 02:26
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mizu_guchi

2021/08/16 00:08

まだ理由まではわかりませんがカレントディレクトリが変わっているようでした。 フルパスを指定するように変更したところ、正常に動作いたしました。 ご回答ありがとうございました。
guest

0

コードが足りないのでそのタイマーの処理がミスってる可能性が大いにありそうだなぁ、ぐらいの感想だけど、そもそも、そういう事したいならFileSystemWatcher クラスを使った方が良いんじゃないかと思う。

投稿2021/08/12 08:59

gentaro

総合スコア8947

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

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

Zuishin

2021/08/14 02:34

パフォーマンスを考えると、タイマーで逐次チェックするより FileSystemWatcher が良いですね。
mizu_guchi

2021/08/16 00:11

ご回答ありがとうございました。 カレントディレクトリが変更されており、フルパスを指定するを指定することで解決いたしました。 FileSystemWatcherについてご教授頂きありがとうございます。 こちらも検討したいと思います。
guest

0

その"A.txt"ってのをフルパスで記述してみては。

#そのファイルってどこにあります?

投稿2021/08/12 08:56

y_waiwai

総合スコア88042

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

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

gentaro

2021/08/12 13:33

> ちなみに、プログラムを再起動すると True が返ってきてねらい通りの処理が行えます。 と書かれているためパスの問題じゃないでしょう。
Zuishin

2021/08/14 02:32

再起動の方法によってカレントディレクトリが変わるかもしれないので、ないとは言い切れないと思います。 フルパスのハードコーディングだと環境の変化に対応できないのでアンチパターンだと思いますが、A.txt をマイドキュメントなどの特殊フォルダ以下のサブフォルダに置いて Environment.GetSpecialFolder などで特定するか、ダイアログでユーザーにファイルを選択させて Settings などに保存する方法で解決する可能性はありますね。 そもそもタイマー処理がブロックされている可能性もあるので、これだけのコードでは何とも言えませんが。
mizu_guchi

2021/08/16 00:13

ご回答ありがとうございました。 何らかの理由でカレントディレクトリが変更されており、おっしゃるとおりフルパスを指定するすることで解決いたしました。 ありがとうございます。
guest

0

皆様、ご回答いただきありがとうございました。

ご指摘の通り、プログラム起動後にカレントディレクトリが変更されておりました。

途中で、他のプログラムを実行する処理があり、それを実行するとカレントディレクトリが変わっておりました。

プログラム起動時に System.IO.Directory.GetCurrentDirectory() でカレントディレクトリを取得しておき、フルパスを指定することで解決いたしました。

ありがとうございました。

投稿2021/08/16 00:30

mizu_guchi

総合スコア9

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

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

0

プログラムを起動後に A.txt を配置した場合、ファイルが存在するにもかかわらずfalseが返ってきます。

自分の環境(Windows 10, VS2019, .NET Framework 4.7.2 の Windows Forms アプリ)で試した限りではそういうことは無かったです。やり方・調べ方の問題ではないかと思います。

ちなみにどのように試したかと言うと、

(1) 以下の Windows Forms アプリで、実行する exe ファイルのあるフォルダに A.txt ファイルを作成し、それを削除してから Visual Studio からアプリを実行します。

イメージ説明

(2) 実行後 TimerStart ボタンをクリックして TimerStart_Click イベントハンドラで Timer を Start します。そうすると 1 秒のインターバルで A.txt ファイルの有無をチェックしますが、ファイルは存在しないので System.IO.File.Exists("A.txt") は false のままとなります。

(3) 上記 (1) で削除した A.txt はゴミ箱にあるので、exe の実行中にそれを元の場所に戻してやります。

イメージ説明

(4) そうすると次の Timer.Tick で System.IO.File.Exists("A.txt") は ture になり、Label に以下のように表示されます。

イメージ説明

やってみてください。「プログラムを起動後に A.txt を配置した場合、ファイルが存在するにもかかわらずfalseが返ってきます」ということはないはずです。

投稿2021/08/13 05:18

編集2021/08/13 07:42
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mizu_guchi

2021/08/16 00:10

ご回答ありがとうございました。 確認したところカレントディレクトリが変更されており、フルパスを指定することで解決いたしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問