2013-10-02 96 views
0

我承認我是這個FTP的東西很新手。我試圖從FTP站點下載文件,提取數據,然後刪除它。下面是相關的代碼(我從一些論壇的功能,但由於一直沒能找到它):VB.Net無法刪除/殺死從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: 
+0

正如錯誤消息所示,您沒有足夠的權限寫入c:\,這在現代版本的Windows中是非常正常的。嘗試在某個地方創建一個新目錄並在那裏寫入。 – dummy

+0

我應該澄清 - 我縮短了C:\的路徑,使它更清潔。但我知道標準特權不是問題,因爲我可以殺死同一目錄中的其他(非ftp源)文件。 – Jon

+0

你有沒有使用「嘗試抓住,最後」? http://msdn.microsoft.com/en-us/library/fk6t46tz.aspx – TheOptimusPrimus

回答

0

使用的應用程序數據文件夾中的問題就會消失。您的應用程序不會自動擁有所有文件夾中的所有文件。

mUserFileDir = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) & _ 
YourFolderName & YourFileName 

Environment.SpecialFolder.LocalApplicationData取決於它在做什麼,爲誰。

也可能檢查文件屬性和保留。可能是那裏的事情。

+0

沒有骰子。無論目錄如何,我都會得到相同的錯誤。 – Jon

+0

你有沒有看過新的DL後文件的權限和屬性? – Plutonix

+0

啊!它被標記爲只讀!我不知道這樣做會使我可以手動刪除它,但不能使用代碼。多麼奇怪。謝謝! – Jon