none
請教有關ftp路徑深度的問題 RRS feed

  • 問題

  • 開發/測試環境: Windows 7, Visual Studio 2010, FTP Server : RHEL6, vsftpd

    小弟有一個需求, 是要去客戶所指定的FTP站點去截取*.csv的檔案下來, 並且將csv檔案中的一些信息存到DB裡面去,

    所以, 小弟有寫一個取得FTP的目錄結構的函數-- getFTPFolderList(), 並且FTP的路徑如URLAddress, 如下:

    URLAddress = "ftp://192.168.12.12/Array/TRPCN/TA080/TA080001/TA080001AA/SOURCE";
    getFTPFolderList(URLAddress);

    而有關 getFTPFolderList()函數的程式碼如下:

    static void getFTPFolderList(string URLAddress)
            {
                try
                {
                    string username = "howard";
                    string password = "1234";
    
                    FtpWebRequest f = (FtpWebRequest)WebRequest.Create(new Uri(URLAddress));
                    f.Method = WebRequestMethods.Ftp.ListDirectory;
                    f.UseBinary = true;
                    f.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested;
                    f.Credentials = new NetworkCredential(username, password);
    
                    StreamReader sr = new StreamReader(f.GetResponse().GetResponseStream());
                    if (sr.EndOfStream == false)
                    {
                        string str = sr.ReadLine();
    
                        f.GetResponse().Close();
                        f = null;
    
                        while (str != null)
                        {
                            string subFilderName = str.Substring(str.IndexOf("/", 1) + 1).ToUpper();
    
                            if (subFilderName != "BACKUP" & subFilderName != "ERROR")
                            {
                                if (subFilderName.IndexOf(".") == -1 & subFilderName != "SOURCE")
                                {
                                    getFTPFolderList(URLAddress + "/" + subFilderName);
                                }
                                else if (subFilderName == "SOURCE")
                                {
                                    MessageBox.Show("insert " + subFilderName.ToString());
                                    getFTPFileList(URLAddress + "/" + subFilderName);
                                }
                            }
                            str = sr.ReadLine();
                        }
                    }
                    else
                    {
                        f.GetResponse().Close();
                        f = null;
    
                        if (subFilderName.IndexOf(".") == -1 & subFilderName != "SOURCE")
                        {
                                    getFTPFolderList(URLAddress + "/" + subFilderName);
                        }
                        else
                        {
                                    MessageBox.Show("insert " + subFilderName.ToString());
                                    getFTPFileList(URLAddress + "/" + subFilderName);
                        }   
                    }
    
                    sr.Close();
                    sr.Dispose();
                    //return strList;
                }
                catch (Exception err)
                {
                    MessageBox.Show(err.ToString());
                }
            }

    當小弟測試, 如果目錄深度是到 

    URLAddress = "ftp://192.168.12.12/Array/TRPCN/TA080/TA080001/TA080001AA";

    的時候, 這個時候, 是還可以取得到Folder List的信息,

    但是當目錄深度是到

    URLAddress = "ftp://192.168.12.12/Array/TRPCN/TA080/TA080001/TA080001AA/SOURCE";

    的時候,

    StreamReader sr = new StreamReader(f.GetResponse().GetResponseStream());
    取回來的sr變數的EndOfStream屬性卻是為true...
    sr.EndOfStream = true;

    但是實際的目錄深度到SOURCE下, 都還是有檔案的, 並且實際上要取得的csv檔案, 是放在SOURCE目錄下, 如下:



    所以, 想要請教一下大大, 是否有遇到類似的問題, 可以指導小弟要如果解決~

    Da-De


    2012年7月16日 上午 07:48

解答

  • 不好意思, 小弟找到問題點了...

    URLAddress = "ftp://192.168.12.12/Array/TRPCN/TA080/TA080001/TA080001AA/SOURCE";

    改成

    URLAddress = "ftp://192.168.12.12/Array/TRPCN/TA080/TA080001/TA080001AA/Source";

    因為Linux下, 是有大小寫的, 所以改成 Source 後, 就可以取得到了.

    Da-De

    • 已標示為解答 Guo-Da-De 2012年7月16日 上午 08:01
    2012年7月16日 上午 08:00

所有回覆

  • 不好意思, 小弟找到問題點了...

    URLAddress = "ftp://192.168.12.12/Array/TRPCN/TA080/TA080001/TA080001AA/SOURCE";

    改成

    URLAddress = "ftp://192.168.12.12/Array/TRPCN/TA080/TA080001/TA080001AA/Source";

    因為Linux下, 是有大小寫的, 所以改成 Source 後, 就可以取得到了.

    Da-De

    • 已標示為解答 Guo-Da-De 2012年7月16日 上午 08:01
    2012年7月16日 上午 08:00
  • 看看 ftp Server 上面有沒有關閉大小寫的區別功能,關閉後亦可。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年7月16日 下午 03:23
  • 感謝 心冷熱情熄 大大的提醒, 不過小弟的FTP Server並不是使用 IIS 所提供的 FTP, 而是使用 RHEL6 的 vsftpd.

    不過, 小弟後來還是有再去確認了下 /etc/vsftpd/vsftpd.conf 裡面的設定, 不過並沒有發現有關關閉大小寫區別的功能.

    並且有去找了下vsftp.conf的manual page, 並且搜尋了 sensitive 關鍵字, 如下:


    結果出現 Pattern not found 的信息, 代表沒有找到符合的條件, 如下:

    另外, 有再看到 Will保哥 的文章... 網頁開發人員應對 URL 的大小寫「有感覺」!可以參考...


    Da-De

    2012年7月17日 上午 12:52
  • 微軟的 FTP Server 沒有大小寫分別,我也沒有提到是要用微軟的阿...

    另外要注意 FTP Server 使用的換行字元是 RFC 規範的標準換行字元還是 Linux FTP Server 慣用的換行字元。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年7月17日 下午 12:51