FileSystemWatcherを使用してファイル監視を行おうと考えています。
対象ディレクトリは2つを監視できるようにしようと試みているのですが、
new を行ったあとでも_WatchersがNothingとなり、その後の処理がエラーになります。

newをしたのち_WatchにFileSystemWatcherの構造が付与されるようにしたいのですが、どこがおかしいのでしょうか?

教えてください。

また、追加で必要な項目がありましたら補足します。

【エラー内容】
'System.NullReferenceException' のハンドルされていない例外が xxx.exe で発生しました。
追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。

【使用環境】
Windows 2000 ,VisualStudio2002(VB) .netFrameWork1.1 使用

--------------------コード------------------------------
Private _Watchers() As System.IO.FileSystemWatcher

Private Sub Initialize()
Dim _ary(1) As String
_ary(0) = "C:\1"
_ary(1) = "C:\2"

_Watchers = New System.IO.FileSystemWatcher(_ary.GetLength(0)) {}

Dim i As Integer
For i = _ary.GetLowerBound(0) To _ary.GetUpperBound(0) - 1
_Watchers(i).EnableRaisingEvents = False
_Watchers(i).Path = _ary(i)
'プロパティ設定
'サブディレクトリは監視しない
_Watchers(i).IncludeSubdirectories = False
'ファイルの変更を監視する
watcher.NotifyFilter = System.IO.NotifyFilters.FileName
'XLSのファイルを監視
_Watchers(i).Filter = "*.xls"
'イベントハンドラの登録
AddHandler _Watchers(i).Created, AddressOf OnChange
'監視の開始
_Watchers(i).EnableRaisingEvents = True
Next i
End Sub 'Initialize

このQ&Aに関連する最新のQ&A

A 回答 (2件)

_watchersの配列の中身を生成していないためです



ReDim ステートメントで2要素の配列にするか
Dim宣言時に添え字を1として2要素にしておいて

Initializeルーチンの Forループの冒頭で
_Watchers(i) = new System.IO.FileSystemWatcher( ary(i) )
などとしてインスタンス化しましょう
    • good
    • 0

--------------------------------------------------------


> _Watchers = New System.IO.FileSystemWatcher...
FileSystemWatcherの配列ができるだけで、_Watchers(0),_Watchers(1),がnullになっています。
_Watchers(0) = new ...
_Watchers(1) = new ...
とインスタンスをセットしないと、_Watchers(i)は使えません。
--------------------------------------------------------
FileSystemWatcherの配列が2個作られることを期待していると思いますが、実際には3個作られてしまいます。
_Watchers = New System.IO.FileSystemWatcher(UBound(_ary)) {}
としてみてください。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

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

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 で最終フォルダ(またはファイル)の名前を取得。

Qタスクトレイ常駐するプログラムの書き方

VisualBasic2008で起動させると、タスクトレイに常駐し、
ダブルクリックや右ボタンから設定メニューを選ぶと、設定用のダイアログボックスが表示されるようなアプリを作成したいのですが、何か簡単なサンプルはあるのでしょうか?

よく見かける例は桜時計やメモリークリーナのようなものです。

タスクトレイで常駐する仕組みが知りたいので、複雑なものより簡単なものを探しています。
このようなタスクトレイ常駐するソフトを解説している本なども合わせて探しています。

Aベストアンサー

とりあえず、ここらあたりが参考になるかと。
http://www.atmarkit.co.jp/fdotnet/dotnettips/392notifyicon/notifyicon.html

Qフォルダ監視してアクションを起こさせる

Windows環境で指定のフォルダに対してファイルの有無を
監視して、ファイルがある場合、特定のアクションを起こさせるていのですが何か良い方法はありませんか?
特定のアクションと言うのは
 1.別フォルダへ移動
 2.添付ファイルとしてメール送付

昔、VBで作ったプログラムはあるのですが
Webブラウザ上で上記1.2を各人に選択させるような
システムにしたいと考えております。
フリーソフトなどあればベストなのですが・・・。

Aベストアンサー

ブラウザからではありませんが、GUIで設定できるフリーソフトで、
http://www.vector.co.jp/vpack/browse/pickup/pw6/pw006212.html
というのがあります。ファイル名をパラメータにしてプログラムの起動が出来るので、移動は簡単に設定出来ると思いますが、メールを送るには、別途そういうコマンドが必要です(BlatJとかVBS+BASP21とか)。

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すでにファイルが開かれている時のエラー回避

VB2010で、ファイルを開いていると下記のコードでエラーがでます。
Dim SR As New System.IO.StreamReader(AppPath & "諸元一覧.csv", System.Text.Encoding.Default)

「諸元一覧.csv」ファイルを閉じてください。
とメッセージを出し、ExitSubしたいのですが、
どういうコードにすればよいのでしょうか。
教えてください。よろしくお願いいたします。

Aベストアンサー

先の回答にあるように、ファイルを開いていてもエラーが出ない場合もあります。

ファイルがロックされている場合は IOException が発生するようなので、
Try ~ Catch で IOException をエラートラップする方法もあります。
(※ただのエラートラップではファイルが存在しない等の他のエラーと
 区別できませんので、エラーの種類まで限定してエラートラップします。)

QVB上で実行中の無限ループの止め方

今まで、CUIベースのBASICでのプログラムの経験はあるのですが
Visual系のBASICは初心者です。
原因はわかっているのでプログラムの修正はできるのですが
VB上でコンパイルして実行したときに無限ループに陥ってしまって
どうにもプログラムをとめられなくなります。
そんなことがないように、実行前に全てのプロジェクトを保存して
いますので、そんなに実害はないのですが、どうすればとめられるのでしょう・・
今現在は、タスクマネージャーから強制終了させています。

Aベストアンサー

無限ループの一番内側に
DoEvents
を入れておくと、ウィンドウ切替え->デバッガ終了操作が出来ますよ

危なそうなとこにも入れておくと、何かと安心です。

QVBからPDFファイル自動生成するには

VBから印刷イメージを自動にPDFファイルに変換し指定フォルダに保存するにはどのようにすればよいのでしょうか?
いろいろ調べても良くわかりません。
できればサンプルプログラムもあれば幸いです。

現在は、通常使うプリンタにAcrobat PDFWriterを指定し手動でPDFファイルを作っている次第です。

環境としてはWindows2000、VB6.0、Acrobat4.05です。

どんな情報でも結構です。お待ちしております。

Aベストアンサー

サンプルです。

Option Explicit

'開発環境: VB6SP5 Acrobat4.0
'参照設定:Adobe Acrobat 4.0 Type Library
'    参照設定初回設定時は「Acrobat」と表示されています
'    一度チェックをつけ、もう一度参照設定ダイアログを開くと「Adobe Acrobat 4.0 Type Library」になっているはずです。

Sub TEST()
  Dim acroApp     As CAcroApp   'CAcroAppオブジェクト
  Dim acroPDDoc    As CAcroPDDoc  'CAcroPDDocオブジェクト
  Dim acroExchAVDoc  As CAcroAVDoc  'CAcroAVDocオブジェクト
  Dim blnRtn     As Boolean   '戻り値
  Dim lngAVDocNum   As Long
  
  'インスタンス生成
  Set acroApp = CreateObject("AcroExch.APP")
  Set acroPDDoc = CreateObject("AcroExch.PDDoc")
  Set acroExchAVDoc = CreateObject("AcroExch.AVDoc")

'デバッグ用
acroApp.Show
 
  'ファイルオープン
  blnRtn = acroExchAVDoc.Open("c:\test.bmp", "")
  If blnRtn Then
    MsgBox "オープンエラー"
    GoTo PGMEND:
  End If
  
  '変換処理中の待機処理
  Do While lngAVDocNum = acroApp.GetNumAVDocs
    DoEvents
  Loop
  
  '変換済みのアクティブPDFファイルオブジェクト取得
  Set acroExchAVDoc = acroApp.GetActiveDoc()
  Set acroPDDoc = acroExchAVDoc.GetPDDoc()
    
  'PDFファイルとしてセーブ
  blnRtn = acroPDDoc.Save(PDSaveFull Or PDSaveCollectGarbage Or PDSaveLinearized, "c:\test.pdf")
  
  If Not blnRtn Then
    MsgBox "セーブエラー"
    GoTo PGMEND:
  End If
 
 
PGMEND:
  '閉じる
  blnRtn = acroExchAVDoc.Close(False)
  acroApp.Exit
 
  '開放
  Set acroExchAVDoc = Nothing
  Set acroPDDoc = Nothing
  Set acroApp = Nothing
End Sub

サンプルです。

Option Explicit

'開発環境: VB6SP5 Acrobat4.0
'参照設定:Adobe Acrobat 4.0 Type Library
'    参照設定初回設定時は「Acrobat」と表示されています
'    一度チェックをつけ、もう一度参照設定ダイアログを開くと「Adobe Acrobat 4.0 Type Library」になっているはずです。

Sub TEST()
  Dim acroApp     As CAcroApp   'CAcroAppオブジェクト
  Dim acroPDDoc    As CAcroPDDoc  'CAcroPDDocオブジェクト
  Dim acroExchAVDoc  As CAcroAVDoc  'CAcro...続きを読む

Qディスク上のサイズとサイズはどうして違うんですか?

ファイルのプロパティ「全般」タブに表示されている「サイズ」と「ディスク上のサイズ」は、どっちが本当のサイズなのでしょうか?
どうしてサイズが違うのですか?
メールでファイルを送るときは、どっちのサイズを見ればいいのでしょうか?
これについて詳しく解説しているページがあったら、それもぜひ教えて下さい。
よろしくお願いします。

Aベストアンサー

「サイズ」はファイルの本当の大きさ、
「ディスク上のサイズ」はファイルが記録されているクラスタを合計した大きさです、
OSはファイルを幾つかのクラスタ(OSが管理するハードディスク上のブロック
の最小単位)を使ってHDDなどのメディアに保存します、

基本的に今のWindowsでは4KBのクラスタサイズで管理しているので例え1バイトのファイルでも「ディスク上のサイズ」4KBのサイズになってしまいます、
つまり常に「ディスク上のサイズ」の方が大きくなっているはずです、

メールに添付する場合は「サイズ」を確認するだけでOKです。

QVBでファイルが開かれているかどうかを確認したい

お疲れ様です。

Open ステートメントで開いたファイルが、閉じていなければ閉じると言う処理をしたいのですが、ファイルが開きっぱなしかどうかを確認するには、どんな方法があるのでしょうか?

よろしくお願いします。

Aベストアンサー

こんにちは

もう一度同じファイルを同じファイルNo.(#1)で
開きに行くと、
開きっぱなしなら“すでに開いています”とエラーになって
閉じていたら、エラーがないので
判断出きるはずです。

QTimerイベントについて

ある処理を30秒おきに実行します。その結果が正常終了するまで繰り返します。正常終了すれば次の処理へ移ります。が、5分間正常終了しなければ次の処理に移るというロジックを考えているのですが、思いつきません。
現在、Timerコントロールを使用してます。TimerをONには出来ますが、処理が自動的に次の処理へ移ってしまう状況です。Timerイベントを走らせた後に結果が分かるまで処理を一時中断したいんです。どなたか助言をお願いします。

Aベストアンサー

こんにちは、honiyonです。

フラグを使えば良いと思います。
グローバル変数を1つ用意します。(例:FLAG)

----タイマー内----
~いろんな処理~
FLAG = 1


----メイン内----
FLAG = 0
~ここでFLAG=0の間ループする~
do
DoEvents
until (FLAG<>0)



最近VBは使ってないので命令語忘れてます(^^;
命令が違う、記述が誤ってるなどご容赦ください(..

参考になれば幸いです(..


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

人気Q&Aランキング

おすすめ情報