使用 wininet.dll 的 FtpFindFirstFile 错误

Posted

技术标签:

【中文标题】使用 wininet.dll 的 FtpFindFirstFile 错误【英文标题】:FtpFindFirstFile error using wininet.dll 【发布时间】:2013-10-21 13:28:53 【问题描述】:

我的 C# 项目中的 FtpFindFirstFile 函数有问题。基本上这个函数只是在指定目录中搜​​索我在程序中提到的文件,但是在函数执行完成之前会出现错误,这是错误的截图:

---------------开始代码------

[System.Runtime.InteropServices.DllImport("wininet.dll", EntryPoint = "InternetOpen", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
static extern IntPtr InternetOpen(
              string lpszAgent, int dwAccessType, string lpszProxyName,
              string lpszProxyBypass, int dwFlags);
[System.Runtime.InteropServices.DllImport("wininet.dll", EntryPoint = "InternetConnect", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
extern public static IntPtr  /*IntPtr*/ InternetConnect(
         IntPtr hInternet, string lpszServerName, int nServerPort,
         string lpszUsername, string lpszPassword, int dwService,
         int dwFlags, int dwContext);

    [System.Runtime.InteropServices.DllImport("wininet.dll", EntryPoint = "FtpFindFirstFile", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    extern public static IntPtr FtpFindFirstFile(
        IntPtr hConnect, string searchFile, out WIN32_FIND_DATA findFileData,
        int flags, IntPtr context); 

    #region WIN32_Structure

    public struct WIN32_FIND_DATA
    
        public int dwFileAttributes;
        public int nFileSizeHigh;
        public int nFileSizeLow;
        public int dwReserved0;
        public int dwReserved1;
        public string cFileName; 
        public string cAlternateFileName;
    
    #endregion

    public void PerformFTP(string HostIP, string logUsrName, string LogPwd, string SendType, string DefaultDir, string fileExtension)
    
        #region Declaration
        WIN32_FIND_DATA win32 = new WIN32_FIND_DATA();
        bool pRoceed;
        #endregion
        pRoceed = true;

        /*  Initialize Internet Connection */
        IntPtr hInternet = InternetOpen("browser", INTERNET_OPEN_TYPE_DIRECT, null, null, 0);
        //IntPtr hInternet = InternetOpen("browser", 1, null, null, 0);

        if (hInternet == IntPtr.Zero)
        
            MessageBox.Show(hInternet.ToString(), "");
            MessageBox.Show(System.Runtime.InteropServices.Marshal.GetLastWin32Error().ToString()); 
        

        /*  Initialize FTP Connection  */
        IntPtr hFTPhandle = InternetConnect(hInternet, HostIP, INTERNET_DEFAULT_FTP_PORT, logUsrName, LogPwd, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
        //IntPtr hFTPhandle = InternetConnect(hInternet, "203.177.252.123", 21, "bomoracle", "bomoracle", 1, 0, 0);

        /*  To check if the FTP connection succeeded */
        if (hFTPhandle == IntPtr.Zero)
        
            pRoceed = false;
            MessageBox.Show(hFTPhandle.ToString(), "");
            MessageBox.Show(System.Runtime.InteropServices.Marshal.GetLastWin32Error().ToString());
            return;
        

        //IntPtr hFind = FtpFindFirstFile(hFTPhandle, "*.DAT" /*+ fileExtension*/ , out win32, 0, IntPtr.Zero);

        IntPtr hFind = FtpFindFirstFile(hFTPhandle, "*.DAT"  , out win32, 0, IntPtr.Zero); **//THIS IS WHERE THE ERROR APPEARS**

        if (hFind == IntPtr.Zero)
        
            if (System.Runtime.InteropServices.Marshal.GetLastWin32Error().ToString() == "RROR_NO_MORE_FILES") 
            
                MessageBox.Show("NO MORE .BOM FILES","EMPTY");
            
            MessageBox.Show("SEARCHING IN THE DIRECTORY FAILED! ", "EMPTY");
        

    

---------------结束代码------

这是错误消息,它出现在执行 if-else 条件之前:

“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”

我不知道是什么导致了错误,我只是在搜索目录,我还没有对那个 ftp 进程执行任何 get 或 put 命令。希望你能帮忙!谢谢!

【问题讨论】:

抱歉,我已经编辑了我的问题。谢谢! 您不使用FtpWebRequest 有什么原因吗?您还可以在创建hFTPHandle 的位置共享代码吗 我不知道 FtpWebRequest 但我的进程只在本地服务器中。我编辑了我的问题,我在调试模式下运行它,错误只出现在“FtpFindFirstFile”进程中。 你从哪里得到 WIN32_FIND_DATA 的定义?你不是缺少几个字段吗? [MSDN](ttp://msdn.microsoft.com/en-us/library/windows/desktop/aa365740(v=vs.85).aspx), [PINVOKE](pinvoke.net/default.aspx/Structures/WIN32_FIND_DATA.html) 【参考方案1】:

我无法回答您的具体问题,但我强烈认为已经有了托管解决方案。请记住,只有当框架没有满足您需求的实现时,您才需要回退到互操作。

var request = (FtpWebRequest)WebRequest.Create("ftp://example.com/");
request.Credentials= new NetworkCredential("username", "password");
// List files
request.Method = WebRequestMethods.Ftp.ListDirectory;

var resp = (FtpWebResponse) request.GetResponse();
var stream = resp.GetResponseStream();
var readStream = new StreamReader(resp.GetResponseStream(), System.Text.Encoding.UTF8);

// handle the incoming stream, store in a List, print, find etc
var files = new List<String>();
if (readStream != null)

    while(!readStream.EndOfStream)
    
      files.Add(readStream.ReadLine());
    
 
// showe them
foreach(var file in files)

   Console.WriteLine(file);

// find one
var fileToFind = "Public";
var foundFile = files.Find( f => f == fileToFind);
Console.WriteLine("found file 0:", foundFile);
// show status
Console.WriteLine("List status: 0",resp.StatusDescription); 

在这个 sn-p 中,我使用了:FtpWebResponseFtpWebRequestWebRequestMethods.FtpList.FindStreamReader

【讨论】:

谢谢,ftpwebrequest 是我需要的,您知道如何在VMS 环境中使用它吗?如果您确实有任何想法,请访问下面链接中的我的其他问题,谢谢! ***.com/questions/28823112/…

以上是关于使用 wininet.dll 的 FtpFindFirstFile 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 wininet.dll 对代理进行身份验证?

使用 Windows wininet.dll 函数的 xml 文件的 Dld 失败

使用 wininet.dll api 从 FTP 站点搜索和检索文件名

Wininet.dll 在提取 cookie 时崩溃 excel 64 位

如果防火墙在 Word 模板 VBA 中使用 wininet.dll,则无法从 FTP 下载文件

c_cpp rip_msd_to_ralgun使用wininet.dll上的meterp扩展格式化输出