正直なところ、私はこの FTP に関してかなりの初心者です。FTP サイトからファイルをダウンロードし、データを抽出してから削除しようとしています。関連するコードは次のとおりです(フォーラムから機能を取得しましたが、それ以来見つけることができませんでした):
Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal HINet As Integer) As Integer
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Integer, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Integer) As Integer
Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Integer, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Integer, ByVal lFlags As Integer, ByVal lContext As Integer) As Integer
Public Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" (ByVal hFtpSession As Integer, ByVal lpszRemoteFile As String, ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, ByVal dwFlagsAndAttributes As Integer, ByVal dwFlags As Integer, ByVal dwContext As Integer) As Boolean
Sub Main()
INet = InternetOpen("MyFTP Control", 1, vbNullString, vbNullString, 0)
INetConn = InternetConnect(INet, "ftp.myftpsite.com", 0, "username", "password", 1, 0, 0)
FtpGetFile(INetConn, "test.csv", "C:\temp.csv", True, 1, 0, 0)
InternetCloseHandle(INetConn)
InternetCloseHandle(INet)
'do stuff with file
Kill("C:\temp.csv")
End Sub
ファイルは正常にダウンロードされますが、kill コマンドで次のエラーが表示されます。「パス 'C:\temp.csv' へのアクセスが拒否されました。」System.IO.File.Delete を使用しても同じエラーが発生します (例外の詳細については、最後のコード セクションを参照してください)。
奇妙なのは、問題なく手動でファイルを削除できることです。また、ファイルをコピーすると、コピーを強制終了できますが、元のファイルは強制終了できません。数日前にダウンロードしたファイルや数回のコンピューターの再起動も強制終了できないため、接続/解放の問題ではないと思います。ファイルを手動でデスクトップに移動できるため、ディレクトリ権限の問題ではないことはわかっていますが、コードを介してファイルを強制終了することはできません。
同じ問題を抱えたフォーラムへの投稿をいくつか見つけましたが、回答は投稿されていません。明確にするために、私はファイルを ftp サイトから削除しようとしているのではなく、私のマシンにダウンロードしたファイルを削除しようとしています。
Visual Studio 2008 を使用しています。よろしくお願いします。
例外の詳細:
System.UnauthorizedAccessException was unhandled
Message="Access to the path 'C:\temp.csv' is denied."
Source="Microsoft.VisualBasic"
StackTrace:
at Microsoft.VisualBasic.FileSystem.Kill(String PathName) at Project1.Module1.Main() at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()
InnerException: