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

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

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

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

VB.NET

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

Q&A

解決済

2回答

6948閲覧

VB.NET のFTPファイル受信処理でインターネット一時キャッシュにあるファイルを受信ファイルと認識してしまう(?)

teranaomasa

総合スコア14

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

VB.NET

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

0グッド

0クリップ

投稿2017/07/25 06:22

編集2017/07/25 14:15

###前提・実現したいこと
いつもお世話になっております。
visualstudio 2015 のvb.netでFTPサーバーに格納されているファイルを
ローカルクライアントPCに受信する処理を開発しています。
画面でボタンを押してFTPサーバーにあるファイルを受信する
処理になります。

###発生している問題・エラーメッセージ
今起きている問題は、受信処理を立て続けに2度行うと、1度目に
受信したファイルは正常に取り込まれるのですが、2度目に受信した
ファイルが1度目に受信した内容と全く同じになってしまいます。

###該当のソースコード

visualBasic.NET

1コード 2Private Declare Function InternetConnect Lib "wininet" Alias "InternetConnectA" ( _ 3 ByVal hInet As System.IntPtr, _ 4 ByVal lpszServerName As String, _ 5 ByVal nServerPort As Int32, _ 6 ByVal lpszUsername As String, _ 7 ByVal lpszPassword As String, _ 8 ByVal dwService As Int32, _ 9 ByVal dwFlags As Int32, _ 10 ByVal dwContext As System.IntPtr) As System.IntPtr 11 12 ''' <summary> 13 ''' インターネットサービスをオープンして、インターネットハンドルを返します。 14 ''' </summary> 15 ''' <param name="lpszAgent">アプリケーションの名前を指定します。この名前が、HTTPプロトコルのユーザーエージェントとして使われます。</param> 16 ''' <param name="dwAccessType">接続方法。</param> 17 ''' <param name="lpszProxyName">プロクシサーバ名。(INTERNET_OPEN_TYPE_PROXY 指定時)</param> 18 ''' <param name="lpszProxyBypass">ローカルでの既知のホスト名またはIPアドレスのリスト。これらのホストに対する要求はプロクシを通さずに行われる。このリストにはワイルドカードを含めることができる。</param> 19 ''' <param name="dwFlags">オプション</param> 20 ''' <returns></returns> 21 ''' <remarks></remarks> 22 Private Declare Function InternetOpen Lib "wininet" Alias "InternetOpenA" ( _ 23 ByVal lpszAgent As String, _ 24 ByVal dwAccessType As Int32, _ 25 ByVal lpszProxyName As String, _ 26 ByVal lpszProxyBypass As String, _ 27 ByVal dwFlags As Int32) As System.IntPtr 28 29 30 31 32#Region "FTP接続" 33 ''' <summary> 34 ''' FTP接続 35 ''' </summary> 36 ''' <remarks></remarks> 37 Public Function FTPConnect(p_serverName As String, 38 p_user As String, 39 p_Pass As String, 40 p_mode As Integer 41 ) As Boolean 42 Dim strHost As String = "" 43 Dim result As Integer = 0 44 Dim ftpmode As Integer = 0 45 strHost = System.Net.Dns.GetHostName() 46 47 Dim blnResult As Boolean = False 48 hSession = System.IntPtr.Zero 49 Try 50 hSession = InternetOpen(vbNullString, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0) 51 Catch ex As Exception 52 Return False 53 End Try 54 If hSession <> System.IntPtr.Zero Then 55 hFtpSession = System.IntPtr.Zero 56 Try 57 If p_mode <> 0 Then 58 '0以外はPASSIVEモード 59 ftpmode = INTERNET_FLAG_PASSIVE 60 Else 61 ftpmode = 0 62 End If 63 64 hFtpSession = InternetConnect(hSession, p_serverName, INTERNET_DEFAULT_FTP_PORT, 65 p_user, p_Pass, INTERNET_SERVICE_FTP, ftpmode, System.IntPtr.Zero) 66 Catch ex As Exception 67 Return False 68 End Try 69 If hFtpSession = System.IntPtr.Zero Then 70 Return False 71 Else 72 73 Return True 74 End If 75 Else 76 Return False 77 End If 78 79 End Function 80 81 82#Region "ファイルダウンロード" 83 ''' <summary> 84 ''' ファイルダウンロード 85 ''' </summary> 86 ''' <param name="fileNm">ファイル名</param> 87 ''' <param name="downFilePath">ダウンロードファイルパス</param> 88 ''' <returns>True:正常 False:異常</returns> 89 ''' <remarks></remarks> 90 Public Function GetFile(ByVal fileNm As String, ByVal downFilePath As String) As Boolean 91 Dim result As Integer = 0 92 93 Try 94 95 result = FtpGetFile(hFtpSession, fileNm, downFilePath, False, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY Or INTERNET_FLAG_RELOAD, 0) 96 97 98 If result = 0 Then 99 Return False 100 End If 101 Catch ex As Exception 102 Return False 103 End Try 104 105 Return True 106 End Function

###試したこと
ファイルを一旦受信し、そのあとにFTPサイトファイルを削除してまた受信処理を行ったところ、なんとまた前に受信したファイルが受信出来てしまいました。
このことから、FTP受信にしようしているローカル端末のキャッシュに残っている?
と推測し、
1回目のファイルを受信

インターネットエクスプローラで「一時ファイルなどの履歴の削除」を行う。

2回目のファイル受信
と行ったところ、2回目が正常な内容で受信ができました。
何とかプログラムでキャッシュを利用しない、依存しないようにできないのでしょうか?
FtpGetFileの引数を変えたり・・等いろいろしたのですが、、
恐れ入りますが、ご教示よろしくお願い申し上げます。

###補足情報(言語/FW/ツール等のバージョンなど)
.NETFRAMEWORK3.5
WINDOWS10
IE11
visualstudio 2015

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

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

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

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

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

koguma98

2017/07/26 00:58

System.Net.FtpWebRequest を利用しない理由はありますか?
teranaomasa

2017/07/26 01:34

お世話になっております。コメントありがとうございます!今回のFTPは「アクティブモード」で行う必要があり、その場合はwininetのAPIを利用しないといけない・・と弊社内の有識者に聞いたため、System.Net.FtpWebRequest を利用せずwininetのAPIを使っております。
guest

回答2

0

  • wininet でキャッシュを利用しない方法として、ダウンロード前にキャッシュをクリアする方法を見たことがあります。

このような強引な方法を使っている場合があるという事は、キャッシュを確実に利用しない方法がない可能性があります。

  • アクティブモードを利用するために wininet を利用しているとのことですが、System.Net.FtpWebRequest クラスには UsePassive プロパティがあります。

System.Net.FtpWebRequest クラスも確認してみてはどうでしょうか?

  • System.Net.FtpWebRequest クラスには CachePolicy プロパティがあります。

NoCacheNoStore を指定することでキャッシュを利用しないようにできると思います。

投稿2017/07/26 01:54

koguma98

総合スコア288

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

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

teranaomasa

2017/07/26 05:05

お世話になっております!早速のご返信および 貴重なアドバイスありがとうございます。 仰る通り「System.Net.FtpWebRequest クラス」も確認しようと思います。 あとwininet のAPIで  DeleteUrlCacheEntry という関数もあるようなので、これも選択肢の考慮して引き続き調査しようと思います!
guest

0

自己解決

【解決しました】

お世話になっております!
FTP受信処理を行う前に
API関数DeleteUrlCacheEntryを使用し、ピンポイントで削除したいFTP受信ファイルのキャッシュを
削除することで対応することにしました。

例)

vb.net

1'宣言部 2 Private Declare Function DeleteUrlCacheEntry Lib "wininet.dll" _ 3 Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Integer 4 5 6#Region "インターネットキャッシュクリア" 7 ''' <summary> 8 ''' インターネットキャッシュクリア 9 ''' </summary> 10 ''' <param name="p_url">フルパス(例:ftp://XXX.XXX.XXX.XXX/recv/abc.txt 等)</param> 11 ''' <remarks></remarks> 12 Public Function DelinetCache(ByVal p_proto As String, ByVal p_url As String) As Boolean 13 14 Dim result As Integer = 0 15 16 Try 17 'キャッシュ削除 18 result = DeleteUrlCacheEntry(p_url) 19 If result = 0 Then 20 Return False 21 End If 22 23 Return True 24 Catch ex As Exception 25 Return False 26 End Try 27 End Function 28#End Region 29

これで削除したいキャッシュだけ削除が可能となりました。
ただし上記例だとファイル名が固定の時のみですが・・。

>koguma98様
お忙しい中、ご教示ありがとうございました。
キャッシュされないのが理想ですが、修正工数等を勘案して
このキャッシュ削除で進んでいきたいと思います。

投稿2017/07/26 07:22

teranaomasa

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問