こんにちわ。
VBで定期的にアップロードされてくるテキストファイルを処理するツールを作成しています。
Win2K環境で、クライアントからFTP転送であるテキストファイルが転送されてきます。
VBで作成中のツールでは1分おきにファイルの有無を確認しています。
当初はうまく動いていましたがたまにエラーが出るようになりました。
いろいろ状況を見ていますと、ファイル転送と同タイミングでファイルを開いた場合に起こっているようです。
FTP転送の有無にかかわらず、該当するファイルが自分自身のプログラム以外から開かれているということをチェックする方法はないですか?
開いていればスキップすると言う方法でこのエラーを回避したいのですが・・・。
お手数をお掛けいたしますが何卒お願い致します。
A 回答 (11件中1~10件)
- 最新から表示
- 回答順に表示
No.11
- 回答日時:
話が原点に戻りそうですが、、、、
#10さん
strSQL = "SELECT * FROM Win32_Process where name = 'ftp.exe'"
Wscript.Echo GetObject("winmgmts:").ExecQuery(strSQL).Count
ということをしたいのですか?
http://okweb.jp/kotaeru.php3?q=655810
私も先ほどの#8でのスクリプトのどこがWin2Kでのサポート外に該当するかわかりませんが、上記スクリプトは2K環境でも動きました。
しかし、、、
FTPでアプロード中に、サーバ側でftp.exeを起動しているとは限らないのではないですか?
質問者は
・サーバ側の$ftproot以下のファイルを監視する
・見つかったファイルが、受信中か完了かを知りたい(サーバ側で)
というのではないですか?
私が知っている限りですが[ftp.exe]は単なるクライアントアプリだと思うのですが、、、
サーバでは、受信をサービス(inetinfo.exe)が行っていると思っています。
http://www.geocities.co.jp/SiliconValley-SanJose …
なのでftp.exeが起動している確立があるのは、送信側のクライアントの方で、サーバ側は普通であれば立ち上がっていなく、仮に起動していても、それが受信中かどうかはわからないのでは?そうじゃなくても、ftp.exeではなくFFFTPなどのツールアプリで行っているかもしれないし、、、
#10さんの履歴を見るとASPでの回答が多いので、私の知らない'おまじない'があるのか、あるいは私の認識違いかと思って、疑問に思ったことを(便乗して)投げさせていただきました。
m(_ _)m
No.10
- 回答日時:
>#8さん
>質問者はWin2Kのようですが、そのスクリプトは動作サポート外では?
こちらなのですが、OSの記載はありませんでした。
当方はXPでしか動作確認はできていないので、「自信なし」。
http://www.microsoft.com/japan/technet/scriptcen …
No.9
- 回答日時:
#8さん
質問者はWin2Kのようですが、そのスクリプトは動作サポート外では?
(違っていたらすいません)
http://www.microsoft.com/japan/technet/scriptcen …
No.8
- 回答日時:
1050YENさんのNo.7の方法で解決かも知れませんが、
一応、ftp.exeが動いているかのチェックを
スクリプトセンターにあったコードに判断を1つ加えてみました。
Set objDictionary = CreateObject("Scripting.Dictionary")
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process")
For each objProcess in colProcesses
objDictionary.Add objProcess.ProcessID, objProcess.Name
Next
Set colThreads = objWMIService.ExecQuery _
("Select * from Win32_Thread")
swFind = 0
For each objThread in colThreads
intProcessID = CInt(objThread.ProcessHandle)
strProcessName = objDictionary.Item(intProcessID)
If InStr(strProcessName, "ftp.exe") <> 0 Then
swFind = 1
Wscript.Echo strProcessName & VbTab & objThread.ProcessHandle & _
VbTab & objThread.Handle & VbTab & objThread.ThreadState
Exit For
End If
Next
If swFind <> 1 Then Wscript.Echo "FTP Not Running!"
No.7
- 回答日時:
検証してみました。
WinXPSp2にて、IISのFTPサーバを立ち上げ、FTPコマンドで大きいファイルのアップロードを行い、先に挙げた参考URLのIsNoOpen関数を利用しました。
(1)For Binary Lock Read As #1
(2)For Binary Lock Read Write As #1
どちらでも、アップロード中を認識できました。
これまた以前に言いましたが、FTP側ではどうやら
※FTP受信処理
{
ファイルオープン(新規モード)
{
受信終了まで書き込み
}
ファイルクローズ
}
という処理を行っているようです。(検証結果からの考察)
ちなみに、ファイルをFTPがロックしていようといまいと、FTPがオープンしているだけで、他から排他で開くことができないので、意識する必要はありません。
No.6
- 回答日時:
>チェックを行うVB側の方の処理を書いたのですよー
考えてみれば、先行Openする方がLockしてくれないと
VB側ではこの方法では検知不可能ですね。
> FTP接続が実行中だとかいう情報をAPIなどから...
タスクマネージャを動かしておいて、コマンドプロンプトで
FTPを起動させると、プロセスに「ftp.exe」が起動されますから、これを確認すれば良いと思います。
参考URLはプロセス関係のスクリプト集です。
参考URL:http://www.microsoft.com/japan/technet/scriptcen …
No.5
- 回答日時:
>#3さんの、
>>>Open inXlsFileName For Binary Lock Read Write As #1
>>となっていますが、Writeはきっといらないですね^^;
>は、逆でしょう。
いえ、FTP側はVBではなさそうなので、チェックを行うVB側の方の処理を書いたのですよー
No.4
- 回答日時:
#3さんの、
>>Open inXlsFileName For Binary Lock Read Write As #1
>となっていますが、Writeはきっといらないですね^^;
は、逆でしょう。
こちらの思惑では、FTPがWriteロックしてくれていれば、
Lock Writeによって読み出しがエラーになるので、
「まだ出力中かも知れない」と判別がつくのです。
FTPの方はファイルをロックしてくれていないのでしょうか。
この回答への補足
皆さん、いろいろコメントを有難う御座います。
まず、FTPサーバー機能はWin2kの標準機能を採用しています。
各クライアントからのFTPソフトは何か決まっていませんのでどのような方法でファイルをアップロードしているかは特定出来ません。
アップロードしている最中であるとか、FTP接続が実行中だとかいう情報をAPIなどから取得する他ないのでしょうか??
No.3
- 回答日時:
追記です。
#2の参考URLは
>Open inXlsFileName For Binary Lock Read Write As #1
となっていますが、Writeはきっといらないですね^^;
No.2
- 回答日時:
>Open Filename For Input As #fileNo
#1さんが言われている
>Lock Read Write
ですが、
http://okweb.jp/kotaeru.php3?q=611232
にて「IsNoOpen」の命名で関数化されています。
※FTP受信処理
{
ファイルオープン(新規モード)
{
受信終了まで書き込み
}
ファイルクローズ
}
という感じで、FTP側が処理をしていたら、この方法で回避できると思います。
もし↓のような2部構成になっていた場合は、回避しようがありませんので、別方法を考える必要があるかもしれません。
※FTP受信処理パート1
{
ファイルオープン(新規モード)
受信データを書き込み
ファイルクローズ
}
※FTP受信処理パート2
{
ファイルオープン(追加モード)
受信データを書き込み
ファイルクローズ
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- iOS HDD交換修理したWindows10・PCのOFFICE プロダクトキーがエラーとなる 2 2023/04/01 02:17
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- サーバー Laravelをレンタルサーバーにインストールするにはどうすればいいですか? 2 2022/06/29 10:17
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
binファイルを解凍したいの...
-
jarファイル
-
.NETアプリを作ったときの .man...
-
テンプレートを開いたらWindows...
-
exeファイルの中身を見る方法は...
-
コマンドプロンプトで、指定し...
-
監視ツールを入れさせられまし...
-
「ブルーファイル」と「グリー...
-
Seasar2のdiconファイルの読み方
-
#include <Windows.h>というヘ...
-
アクセス 壊れた? 「ファイ...
-
dreamweaverの並び替え
-
ラッパーって何なんでしょう・...
-
エラー:ファイル形式が認識で...
-
HSPのdpmファイルの使い方
-
C言語---ファイルに出力したデ...
-
CSSを1ページに1枚作るのって変...
-
VBAのバイナリ出力について
-
HTMLからのBATファイル実行
-
バッチ処理で追記コピーしたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アクセス 壊れた? 「ファイ...
-
#include <Windows.h>というヘ...
-
binファイルを解凍したいの...
-
Latexで図番号だけを「図1.1」...
-
.NETアプリを作ったときの .man...
-
C言語---ファイルに出力したデ...
-
exeファイルをデータ転送サービ...
-
Word VBA MSGBOX 内で降順表示
-
jarファイル
-
公文書のxmlファイルの開き方が...
-
参照するファイルをワイルドカ...
-
コマンドプロンプトで、指定し...
-
パイソンでpy ファイルと p...
-
exeファイルの中身を見る方法は...
-
コマンドプロンプトで作成日時...
-
ハッシュ値を取る時はファイル...
-
CSSを1ページに1枚作るのって変...
-
実行ファイル(.exeファイル)...
-
バッチ処理で追記コピーしたい
-
自分で作成した重要ファイルを...
おすすめ情報