none
API FileDelete RRS feed

  • 問題

  • 各位好 :
    設計環境 : WinXp , VB2008
    我設計了一個個人FTP使用介面 , 引用 API來進行FTP檔案操作
    其中檔案的上傳 與下載 , 均能正常與Server連接與操作
    但是我要刪除Server上的檔案時 , 雖然回傳的值是成功的 , 但實際上 檔案是沒有被刪除的
    我線上找了許多說明及範例 , 但似乎沒有解決 , 請問各位問題可能在那一個環節呢 ?

    以下是FTP FileDelete的程式碼 :

     Public Declare Function FtpDeleteFile Lib "WININET.DLL" Alias "FtpDeleteFileA" (ByVal hConnect As Long, ByVal lpszFileName As String) As Long
    
     '=========================================
     ' FTP 刪除檔案
     '=========================================
        Public Shared Sub DeleteFile(ByVal IP As String, ByRef filename As String)
            Dim hOpen As Integer
            Dim hConnection As Integer
            Dim result As Long
            hOpen = 0
            hConnection = 0
    
            Try
                    hOpen = InternetOpen("FTPDeleteFile", INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
                If (hOpen <> 0) Then  
    
                  hConnection = InternetConnect(hOpen, IP, INTERNET_DEFAULT_FTP_PORT, "", "", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)
                    If (hConnection <> 0) Then 
    
                        Dim lpszDir As String
                        Dim lpdwDir As Long                       
                      lpdwDir = 256                 
                        lpszDir = Strings.Format(lpdwDir, Chr(0))  
                        result = FtpGetCurrentDirectory(hConnection, lpszDir, lpdwDir)  
                        result = CLng(FtpSetCurrentDirectory(hConnection, lpszDir))     
                        If (result <> 0) Then                         result = CLng(FtpDeleteFile(hConnection, filename))
                            If (result = 0) Then 
                                Err.Raise(Err.LastDllError, Description:="檔案刪除失敗")
                            End If
                        Else
                        Err.Raise(Err.LastDllError, Description:="Directory變更失敗")
                        End If
                    Else
                Err.Raise(Err.LastDllError, Description:="無法連接到 FTP Server")
                    End If
                Else
                  Err.Raise(Err.LastDllError, Description:="無法連接到 FTP Server")
                End If
            Finally
                 If (hConnection <> 0) Then InternetCloseHandle(hConnection)
                    If (hOpen <> 0) Then InternetCloseHandle(hOpen)
            End Try
    
        End Sub
    回傳值是成功的 , 但實際再去讀一下Server的 File List 檔案依然還在

    請各位幫忙
    2010年1月4日 上午 10:41

解答

所有回覆

  • 有確定在FTP上面有刪除的權限嗎?另外,API的第一個參數hConnect改為Integer測試看看。
    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守
    2010年1月4日 上午 11:41
    版主
  • hi
    改成這樣嘗試看看
    Public Declare Function FtpDeleteFile Lib "WININET.DLL" Alias "FtpDeleteFileA" (ByVal hConnect As Integer, ByVal lpszFileName As String) As Boolean

    參考FtpDeleteFile Function
    http://msdn.microsoft.com/en-us/library/aa384142(VS.85).aspx

    http://www.dotblogs.com.tw/ricochen/Default.aspx
    • 已編輯 ricoisme 2010年1月4日 下午 01:22 補上參考資料
    • 已標示為解答 Angusruby 2010年1月5日 上午 01:18
    2010年1月4日 下午 01:11
  • 以 API 的習慣來說,result 是 0 時才是成功,非零值都是失敗,你要用 GetLastError() 來取得真正的錯誤是什麼。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    如果只會用 "看" 的學程式,那不如早點改行,以免誤己一生...
    若不想快點得到解答,可以儘量把問題寫模糊一點,愈模糊愈不會得到解答。
    除非不能打中文,否則請尊重當地語系的網友,使用中文發問或回答,這是一種基本禮貌。
    2010年1月4日 下午 01:19
    版主
  • bauann版大你好 :

    我將向FTP的售服人員確認 , 有進一步回應我將再向各位說明結果

    謝謝
    2010年1月4日 下午 02:46
  • ricoisme 你好 :

    謝謝你的建議 , 我調整一下 , 測試後的結果將再向你回應

    謝謝
    2010年1月4日 下午 02:48
  • 小朱版大 :

    我參考了很多說明 , 還有範例 , 有關FTP的API 都是非零值才成功
    是不是有我漏掉的關鍵呢
    請多指教 .

    以下是我參考的其中之一的網站
    http://www.red.oit-net.jp/tatsuya/vb/WinInet.htm


    很多網站寫的大都類似

    2010年1月4日 下午 02:51
  • 我是依 Windows API 的慣例來說的,當然也會有例外 ...
    最準的就是 API GetLastError() 傳回 0 (表示沒有錯誤)。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    如果只會用 "看" 的學程式,那不如早點改行,以免誤己一生...
    若不想快點得到解答,可以儘量把問題寫模糊一點,愈模糊愈不會得到解答。
    除非不能打中文,否則請尊重當地語系的網友,使用中文發問或回答,這是一種基本禮貌。
    2010年1月4日 下午 03:06
    版主
  • 我是覺得 vb6 直接貼到 vbnet 的問題...

    先前我自己也有改寫過 vb6 的 wininet.dll ftp 相關程式碼,我是記得有好幾個 IntPtr 會死的莫名其妙。

    此外,IE7 以後的 wininet.dll 網際網路設定那邊變更已與直接呼叫 API 無關,有 2gb 限制,又不能處理 PSAV...

    我自己是在網路上找個使用 socket 的 ftp 類別原始碼來改,早就不考慮使用 wininet.dll 了...
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年1月4日 下午 04:32
  • 各位好 :

    感謝各位熱心的幫忙 , 問的點已經找到了 , 我再針對各位的回應一一回答 :

    1. To bauann版大 : 我問過FTP Server的公司 , 是有刪除的權限的
    2. To ricoisme  :
       你的建議是正確的 : 只要變更Byval hConnect as Long -->Byval hConnect as Integer即可 函式回傳為 Integer或者Boolean 兩者都可以
       謝謝你 !
    3.To 小朱版大 :
       你提的論點應該是正確的 , 在實際執行FTP操作時 , 回傳值應該是布林值 , 網路上的範例大部份都是不正確的(但卻也可使用!!!真奇怪)
    4. To 心冷 :
       我也想使用其它的方式來實現FTP , 但
       第一  : FtpWebRequest類別 , 真的如你以前所說的 , 真的很鳥 , 我試了很長一段時間 , 最後放棄了
       第二 : 網路上 ftp類別的範例, 我也試了很多 , 最後還是放棄了
      你的建議我能接受 ,   我在往後會再想辦法突破 , 看能不能自己做出ftp類別

    2010年1月5日 上午 01:17
  • 因為有一陣子我也做過,剛好需要使用到 ftp ...
    首先考慮是 .Net 2.0 內建 ftp ,當然是用內建的... 結果目標 server 是 linux ftp ,換行指令不同... 殘念...
    之後考慮是該功能先前在 vb6 也有做過,是呼叫 wininet.dll 的,所以想說把 vb6 程式碼遷移到 vb2005 ... 結果有幾個 IntPtr 就是過不了... 殘念... (有點忘了,好像是列出目錄在 FindFileData 那邊出問題)
    最後找了一個 vb2003 ftp class 的範例來改... 可以處理 psav ,讚~
    vb 版公告區的那個資源分享中,有個 ftpclass 的範例,好像是我當初抓的,不過當初抓的時候,記得不是在微軟範例網站抓的。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年1月5日 上午 07:17