
客先に納入したVBのプログラムなのですが、先日「75:パス名が無効です」のエラーが発生しました。
エラーが発生した部分はファイルをオープンし、読み込む処理を行っているところです。
このファイルは他のプログラムからもアクセスすることがあるためオープン時にロックして処理を行っています。
「55:ファイルは既に開かれています」や「70:書き込み出来ません」のエラーが発生することは分かっていたのでエラートラップを仕込んであります。
以下にその処理を抜粋しました。
intFileNo = FreeFile()
Open strFileName For Random Lock Read Write As #intFileNo Len = Len(udtHeader)
…(ここにエラートラップ処理が記述してあります)
Get #intFileNo, 1, udtHeader
close
※strFileNameには読込対象となるファイル名が格納されます。iniファイルから読み込んだ値と固定文字列から生成しているので空白になっていたりすることは考えられません。
※udtHeaderはレコードで読み書きするためのユーザ定義型変数です。
上に記述した他のプログラムも同様の処理でファイルアクセスを行っています。
ファイルオープン前にファイルの有無チェックは行っています。
この中の処理で「パス名が無効です」が発生する要因が分からず困っています。
自分だけではなく他のプログラムもアクセスすることが要因としてあるだろうとは思うのですが、どのような状況になれば発生するかが分かりません。
もし、なにか分かる方がいらっしゃいましたらご教授お願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
「パス名が無効」というキーワードにて
私の記憶が反応し、その材料をもとに考えられるものとして…
・現場では、アクセスするファイルを格納しているディレクトリの
パス中にスペースが入っている。
この場合、推測される動きは
スペースの部分でパス名が区切られてしまうため
Open処理は成功したっぽい動きをしてしまう。
しかしGet処理では目的のファイルは存在していないうえ
アクセスしようとしているパス自体が存在していないために
「パス名が無効です」というエラーになると考えられます。
これ「C:\Documents and Settings\~~」とかに格納していると発生してしまうという
とある分野では盲点をつかれた微妙に有名な現象。
対策はダブルクォーテーションでくくった格好で指定するらしいです。
似たようなものに、単純にパス名が長過ぎというのがあります。
・連続稼動しているため、別の部分の影響が溜まりに溜まって
結果、その部分が被害を受けた。
この場合、乱暴な言い方をするなら
「そのソースが関わっている全てのリストが調査対象」
となってしまいます。
どこかの変数の領域確保の大きさが間違っていたり、
想定以上のデータを処理が発生した影響により
結果、パス名を格納している部分のメモリが破壊された。
VBで発生しうるものかどうか判りませんが
しうるかどうか判らないからこそ
稼働環境を考えると可能性が高いともいえます。
客先で確認可能でしたら、Open 前後、Get 前後に MsgBox でもで
パス名を表示させてみてもよいでしょう。
件数や時間など、なんらかの特定のタイミングで発生しているなら
どこかでファイルを開きっ放され過ぎ~~の結果、オープンできなかった。
(つまり #inrFileNo が不定となった。)
けれどエラートラップに捕まってオープンできたフリになった。
なのに Get しようとしたので悲鳴をあげた。
どちらにしても、質問文にある数行のステップでも
稼働時間、データ件数、空き容量などの複数の要素が想定されます。
さて、エラーを引き起こしている正体は
どのような証拠隠滅をしているのでしょう。
あっ、「一つのディレクトリに作成可能なファイル数の上限を超えた」
というのを忘れていました。
以上、ソフト障害プロファイリング遅報でした。
この回答への補足
回答ありがとうございます。
Openするファイルのパスにスペースは入っていませんし、文字数も30字程度なので問題ありません。
既に存在しているファイルに対して処理を行っているので、作成可能ファイル数の上限は大丈夫です。
連続稼働していて、他のプログラムからも同じファイルをアクセスしているためにメモリを破壊してしまうような可能性があるのでしょうか?
何日かはメンテナンスで停止することもありますが、3年間ほど稼働し続けている状態で今までに一回も発生しておらず、発生直前の1秒前にも同じ処理を行っていますが、まったく問題ありませんでした。
メモリが破壊されてしまう可能性を検証することを考えてみます。
No.3
- 回答日時:
エラーが発生したときにstrFileNameの値は意図したファイルが入っているんですよね?
1つ1つ間違いないのか潰していくしかないですね。
間違いないと思ってたらウッカリってよくあるし。
>「55:ファイルは既に開かれています」や「70:書き込み出来ません」のエラーが発生することは分かっていたのでエラートラップを仕込んであります。
最悪↑の処理にエラー発生時の処理も入れるしかないのかな。
この回答への補足
Open処理の前にファイルの存在チェックを行っていますし、もしファイルが存在しなくても新規に作成するのでstrFileNameに意図したファイル名が入っていなくてもエラーは発生しません。
今回の質問は上記のソースコードで「パス名が無効です」のエラーが発生する要因を教えて頂きたいのです。
エラートラップで回避するようには既になっているので、なぜこのエラーが発生してしまったかを突き止めたいのです。
No.2
- 回答日時:
他のプログラムってのの挙動を調べる必要はないでしょうか?
たとえば他のプログラムで該当ファイルを削除したりとか移動しているとか。
あとはstrFileNameってのがグローバル宣言されていてどっかのプログラムから値を書き換えられているとか・・・
この回答への補足
回答ありがとうございます。
他のプログラムの動作はこのプログラムと同じ記述でファイル内容を読み込むだけです。ファイルを削除したり、移動したりはしていません。
strFileNameはプロシージャ内で宣言されており、プログラム内の他の部分で書き換えられることはありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ExcelでVBAを使用した際に、『パス名が無効です』とエラーになります。
Excel(エクセル)
-
マクロを実行するとパス名が無効です
その他(Microsoft Office)
-
MkDir パス名が無効です
Visual Basic(VBA)
-
-
4
VB実行時エラー75:「パス名が無効です」について
Visual Basic(VBA)
-
5
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
6
VB6.0 パスが見つかりません
Visual Basic(VBA)
-
7
「パス名が無効です」と表示されて実行出来ません
その他(ソフトウェア)
-
8
エクセルVBAでセルに入力したパスでブックを開く
Excel(エクセル)
-
9
VBAでファイルパスが長すぎてコピー時のエラー対策
Excel(エクセル)
-
10
FileCopy時のエラー
Visual Basic(VBA)
-
11
Access VBAで行ラベルが定義されていないというエラーが出ます
Access(アクセス)
-
12
Accessのマクロでモジュールを実行させたい。
Access(アクセス)
-
13
Excel VBAで、ユーザーフォームの値を、モジュールで使用したい。
Visual Basic(VBA)
-
14
エクセルで複数のシートのクリアをしたいです
Excel(エクセル)
-
15
エクセルを共有するとPCによって表示が異なるのはなぜでしょう。。
その他(Microsoft Office)
-
16
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
17
Excelでのセル内容の高速消去方法
その他(プログラミング・Web制作)
-
18
Excelのハイパーリンクのアドレスが勝手に変わる
その他(Microsoft Office)
-
19
テキストボックスのvalueとtextの違い
Visual Basic(VBA)
-
20
VBAでセル値からフォルダ名を取得するコードについて
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel 2003 のエラーメッセージ
-
access テキストボックスの値取得
-
エクセルで質問です。 ハイパー...
-
ExcelVBAで既に開いてるwordを...
-
【関数】同じ関数なのに、エラ...
-
VBでファイルが開かれているか...
-
「パス名が無効です」の発生原因
-
VBから参照できないCのDLLを使...
-
Returnに対するGoSubがありません
-
VBAでDLLが見つからないエラー
-
batファイルでレジストリキーの...
-
EXCELのVBAでの保存方法
-
VB6 Dir関数で52エラー発生
-
PowerShellを使って関連付けら...
-
FORTRANの実行エラーについて
-
エクセルマクロでエラーの原因...
-
ファイルのオープンについて
-
FTPの送信結果を検知したい
-
gccを行ってもexeファイルが生...
-
エクセル2000のマクロにつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【関数】同じ関数なのに、エラ...
-
access テキストボックスの値取得
-
エクセルで質問です。 ハイパー...
-
「パス名が無効です」の発生原因
-
PowerShellを使って関連付けら...
-
NAS上のファイルの使用中が解除...
-
gccを行ってもexeファイルが生...
-
アクセスのクエリでコンパイル...
-
ExcelVBAで既に開いてるwordを...
-
Returnに対するGoSubがありません
-
VB6 Dir関数で52エラー発生
-
VBでファイルが開かれているか...
-
データベースソフトのアクセス2...
-
エクセルマクロでエラーの原因...
-
fcloseで発生するエラーについて。
-
batファイルでレジストリキーの...
-
FORTRANの実行エラーについて
-
VBから参照できないCのDLLを使...
-
【COBOL】read文でエラー
-
DisplayAlertsブロパティで ”実...
おすすめ情報