
客先に納入した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
FileCopy時のエラー
Visual Basic(VBA)
-
6
RmDirでフォルダが削除できない vba
PowerPoint(パワーポイント)
-
7
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
8
「パス名が無効です」と表示されて実行出来ません
その他(ソフトウェア)
-
9
エクセルVBAでセルに入力したパスでブックを開く
Excel(エクセル)
-
10
VB6のプロジェクトロードエラーについて
Visual Basic(VBA)
-
11
On ErrorでエラーNoが0
Visual Basic(VBA)
-
12
ネットワークドライブのファイルをFileCopyできない
Visual Basic(VBA)
-
13
frxファイルの役目
Visual Basic(VBA)
-
14
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
15
エクセルからアクセスにインポートすると、エラーが出てしまいます。原因を教えていただけませんか。
Access(アクセス)
-
16
VB6でLabelの最前面にText Boxを書く
Visual Basic(VBA)
-
17
UserForm1.Showでエラーになります。
工学
-
18
VBAでファイルパスが長すぎてコピー時のエラー対策
Excel(エクセル)
-
19
VBAで指定シート以外の選択
Visual Basic(VBA)
-
20
特定のPCだけ動作しないVBAマクロがあります。その理由は?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
access テキストボックスの値取得
-
ExcelVBAで既に開いてるwordを...
-
「パス名が無効です」の発生原因
-
VBでファイルが開かれているか...
-
batファイルでレジストリキーの...
-
gccを行ってもexeファイルが生...
-
フロッピー上のファイルクロー...
-
エクセルマクロでエラーの原因...
-
VB6 Dir関数で52エラー発生
-
ASP.NETでWebConfigのエラー
-
アクセスのクエリでコンパイル...
-
NAS上のファイルの使用中が解除...
-
freadでデータがない場合の読込...
-
至急
-
Request.BinaryReadでのエラー
-
VBAでDLLが見つからないエラー
-
PCにmicroSDカードを(USBで)差...
-
VB実行時エラー75:「パス名が...
-
ネットワーク上でのファイル操...
-
fgets関数のEOFの扱い方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
access テキストボックスの値取得
-
Returnに対するGoSubがありません
-
「パス名が無効です」の発生原因
-
PowerShellを使って関連付けら...
-
NAS上のファイルの使用中が解除...
-
アクセスのクエリでコンパイル...
-
VBでファイルが開かれているか...
-
ExcelVBAで既に開いてるwordを...
-
エクセルマクロでエラーの原因...
-
batファイルでレジストリキーの...
-
【COBOL】read文でエラー
-
VB6 Dir関数で52エラー発生
-
「アクティブ ユーザーが多すぎ...
-
データベースソフトのアクセス2...
-
VBから参照できないCのDLLを使...
-
DisplayAlertsブロパティで ”実...
-
Access2013にてドラッグ&ドロ...
-
ACCESS VBAでのインポート
-
すでにファイルが開かれている...
-
Vba ファイル書き込み時に書き...
おすすめ情報