當前位置:首頁 » 文件管理 » ftp循環下載

ftp循環下載

發布時間: 2023-03-13 09:48:48

A. linux shell腳本的循環下載

#!/bin/bash
#usage:getfileFirstDayLastDay
curday=$2
firstday=$1

while[$firstday-le$curday]
do
echo$curday

lftpusername:[email protected]<<EOF
lcd/ftp_folder
binary
getFile_$curday.csv-oFile_$curday.csv
close
bye
EOF

curday=`date-d"$curday1dayago"+%Y%m%d`
done

直接日期加1的根本沒考慮日期跨月的情況

B. shell腳本中ftp問題

ftp 登錄後,我感覺是不支持shell語法的(目前還不確定),建議使用mget 下載多個文件!

C. 關於如何實現FTP上傳或者下載帶進度和速率的實現方法

在這里需要說明的是,該方式是通過其他代碼進行改進的。 首先我們需要定義一個委託,用來實現傳輸過程中傳遞文件的總數,已完成的位元組數和速度,方便客戶端界面上調用。 public delegate void TransferProcess(long total,long finished,double speed); 調用代碼就不舉例了 接下來我們建立一個FTPClient類,該類基於socket和FTP協議實現了連接FTP服務,建立目錄,上傳文件,下載文件等主要方法。結構如下: 需要注意的是,我們需要定一個事件event TransferProcess OnTransferProcess;該事件在實例化FTPClient之後需要調用,這個事件對實現進度條和速率是非常重要的。為了實現速率我們還需要定義個公開的成員startTime(開始時間)。我們現在主要是看一下如何上傳的。 /// /// 上傳一個文件 /// /// 本地文件名 public void Put(string strFileName) { //連接伺服器 if (!bConnected) { Connect(); } UpdateStatus = true; //建立socket連接 Socket socketData = CreateDataSocket(); //向FTP伺服器發生存儲命令 SendCommand("STOR " + Path.GetFileName(strFileName)); //如何伺服器返回的信息不是我們所需要的,就拋出異常 if (!(iReplyCode == 125 || iReplyCode == 150)) { throw new IOException(strReply.Substring(4)); } //建立本地文件的數據流 FileStream input = new FileStream(strFileName, FileMode.Open); int iBytes = 0; long total = input.Length;//該成員主要記錄文件的總位元組數,注意這里使用長整型,是為了突破只能傳輸2G左右的文件的限制 long finished = 0;//該成員主要記錄已經傳輸完成的位元組數,注意這里使用長整型,是為了突破只能傳輸2G左右的文件的限制 double speed = 0;//記錄傳輸的速率 while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)//循環從本地數據流中讀取數據到緩沖區 { //Console.WriteLine(startTime.ToString()); socketData.Send(buffer, iBytes, 0);//將緩沖區的數據發送到FTP伺服器 DateTime endTime = DateTime.Now;//每次發送數據的結束時間 TimeSpan ts = endTime - startTime;//計算每次發送數據的時間間隔 finished += iBytes;//計算完成的位元組數. Console.WriteLine(ts.Milliseconds); //計算速率,注意finished是位元組,所以需要換算沖K位元組 if (ts.Milliseconds > 0) { speed = (double)(finished / ts.TotalMilliseconds); speed = Math.Round(speed * 1000 / 1024, 2); } //這里是必不可少的,否則你無法實現進度條 //如果傳輸進度事件被實例化,而且從本地數據流中讀取數據不是空的並完成的位元組數也不為空的話,則實現委託. if (OnTransferProcess != null&&iBytes>0&&finished>0) { OnTransferProcess(total, finished,speed); } } UpdateStatus = false; finished = 0; input.Close();//當傳輸完成之後需要關閉數據流,以便下次訪問. if (socketData.Connected) { socketData.Close();//關閉當前的socket } if (!(iReplyCode == 226 || iReplyCode == 250)) { ReadReply(); if (!(iReplyCode == 226 || iReplyCode == 250)) { UpdateStatus = false; throw new IOException(strReply.Substring(4)); } } } 上面代碼中注釋寫得比較詳細,這里就不再一一講解了,關於下載中實現進度條和速率的問題可以參考以上代碼進行修改. 完整的代碼如下: using System; using System.net; using System.IO; using System.Text; using System.net.Sockets; namespace MMSEncoder { public delegate void TransferProcess(long total,long finished,double speed); /// /// FTP Client /// public class FTPClient { public event TransferProcess OnTransferProcess; public bool UpdateStatus = true; public DateTime startTime; private bool IsAbortConnect = false; #region 構造函數 /// /// 預設構造函數 /// public FTPClient() { strRemoteHost = ""; strRemotePath = ""; strRemoteUser = ""; strRemotePass = ""; strRemotePort = 21; bConnected = false; } /// /// 構造函數 /// /// FTP伺服器IP地址 /// 當前伺服器目錄 /// 登錄用戶賬號 /// 登錄用戶密碼 /// FTP伺服器埠 public FTPClient(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort) { strRemoteHost = remoteHost; strRemotePath = remotePath; strRemoteUser = remoteUser; strRemotePass = remotePass; strRemotePort = remotePort; Connect(); } #endregion #region 登陸欄位、屬性 /// /// FTP伺服器IP地址 /// private string strRemoteHost; public string RemoteHost { get { return strRemoteHost; } set { strRemoteHost = value; } } /// /// FTP伺服器埠 /// private int strRemotePort; public int RemotePort { get { return strRemotePort; } set { strRemotePort = value; } } /// /// 當前伺服器目錄 /// private string strRemotePath; public string RemotePath { get { return strRemotePath; } set { strRemotePath = value; } } /// /// 登錄用戶賬號 /// private string strRemoteUser; public string RemoteUser { set { strRemoteUser = value; } } /// /// 用戶登錄密碼 /// private string strRemotePass; public string RemotePass { set { strRemotePass = value; } } /// /// 是否登錄 /// private Boolean bConnected; public bool Connected { get { return bConnected; } } #endregion #region 鏈接 /// /// 建立連接 /// public void Connect() { //if (IsAbortConnect) throw new IOException("用戶強制終止了FTP"); socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort); // 鏈接 try { socketControl.Connect(ep); } catch (Exception) { throw new IOException("無法連接到遠程伺服器!"); } // 獲取應答碼 ReadReply(); if (iReplyCode != 220) { DisConnect(); throw new IOException(strReply.Substring(4)); } // 登陸 SendCommand("USER " + strRemoteUser); if (!(iReplyCode == 331 || iReplyCode == 230)) { CloseSocketConnect();//關閉連接 throw new IOException(strReply.Substring(4)); } if (iReplyCode != 230) { SendCommand("PASS " + strRemotePass); if (!(iReplyCode == 230 || iReplyCode == 202)) { CloseSocketConnect();//關閉連接 throw new IOException(strReply.Substring(4)); } } bConnected = true; // 切換到初始目錄 if (!string.IsNullOrEmpty(strRemotePath)) { ChDir(strRemotePath); } } /// /// 關閉連接 /// public void DisConnect() { if (socketControl != null) { SendCommand("QUIT"); } CloseSocketConnect(); } public void AbortConnect() { if (socketControl != null) { SendCommand("ABOR"); } IsAbortConnect = true; //CloseSocketConnect(); } #endregion #region 傳輸模式 /// /// 傳輸模式:二進制類型、ASCII類型 /// public enum TransferType { Binary, ASCII }; /// /// 設置傳輸模式 /// /// 傳輸模式 public void SetTransferType(TransferType ttType) { if (ttType == TransferType.Binary) { SendCommand("TYPE I");//binary類型傳輸 } else { SendCommand("TYPE A");//ASCII類型傳輸 } if (iReplyCode != 200) { throw new IOException(strReply.Substring(4)); } else { trType = ttType; } } /// /// 獲得傳輸模式 /// /// 傳輸模式 public TransferType GetTransferType() { return trType; } #endregion #region 文件操作 /// /// 獲得文件列表 /// /// 文件名的匹配字元串 /// public string[] Dir(string strMask) { // 建立鏈接 if (!bConnected) { Connect(); } //建立進行數據連接的socket Socket socketData = CreateDataSocket(); //傳送命令 SendCommand("NLST " + strMask); //分析應答代碼 if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226)) { throw new IOException(strReply.Substring(4)); } //獲得結果 strMsg = ""; while (true) { int iBytes = socketData.Receive(buffer, buffer.Length, 0); strMsg += GB2312.GetString(buffer, 0, iBytes); if (iBytes < buffer.Length) { break; } } char[] seperator = { '
' }; string[] strsFileList = strMsg.Split(seperator); socketData.Close();//數據socket關閉時也會有返回碼 if (iReplyCode != 226) { ReadReply(); if (iReplyCode != 226) { throw new IOException(strReply.Substring(4)); } } return strsFileList; } /// /// 獲取文件大小 /// /// 文件名 /// 文件大小 public long GetFileSize(string strFileName) { if (!bConnected) { Connect(); } SendCommand("SIZE " + Path.GetFileName(strFileName)); long lSize = 0; if (iReplyCode == 213) { lSize = Int64.Parse(strReply.Substring(4)); } else { throw new IOException(strReply.Substring(4)); } return lSize; } /// /// 刪除 /// /// 待刪除文件名 public void Delete(string strFileName) { if (!bConnected) { Connect(); } SendCommand("DELE " + strFileName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } /// /// 重命名(如果新文件名與已有文件重名,將覆蓋已有文件) /// /// 舊文件名 /// 新文件名 public void Rename(string strOldFileName, string strNewFileName) { if (!bConnected) { Connect(); } SendCommand("RNFR " + strOldFileName); if (iReplyCode != 350) { throw new IOException(strReply.Substring(4)); } // 如果新文件名與原有文件重名,將覆蓋原有文件 SendCommand("RNTO " + strNewFileName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } #endregion #region 上傳和下載 /// /// 下載一批文件 /// /// 文件名的匹配字元串 /// 本地目錄(不得以\結束) public void Get(string strFileNameMask, string strFolder) { if (!bConnected) { Connect(); } string[] strFiles = Dir(strFileNameMask); foreach (string strFile in strFiles) { if (!strFile.Equals(""))//一般來說strFiles的最後一個元素可能是空字元串 { if (strFile.LastIndexOf(".") > -1) { Get(strFile.Replace("\r", ""), strFolder, strFile.Replace("\r", "")); } } } } /// /// 下載一個文件 /// /// 要下載的文件名 /// 本地目錄(不得以\結束) /// 保存在本地時的文件名 public void Get(string strRemoteFileName, string strFolder, string strLocalFileName) { if (!bConnected) { Connect(); } SetTransferType(TransferType.Binary); if (strLocalFileName.Equals("")) { strLocalFileName = strRemoteFileName; } if (!File.Exists(strLocalFileName)) { Stream st = File.Create(strLocalFileName); st.Close(); } FileStream output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create); Socket socketData = CreateDataSocket(); SendCommand("RETR " + strRemoteFileName); if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226 || iReplyCode == 250)) { throw new IOException(strReply.Substring(4)); } while (true) { int iBytes = socketData.Receive(buffer, buffer.Length, 0); output.Write(buffer, 0, iBytes); if (iBytes <= 0) { break; } } output.Close(); if (socketData.Connected) { socketData.Close(); } if (!(iReplyCode == 226 || iReplyCode == 250)) { ReadReply(); if (!(iReplyCode == 226 || iReplyCode == 250)) { throw new IOException(strReply.Substring(4)); } } } /// /// 上傳一批文件 /// /// 本地目錄(不得以\結束) /// 文件名匹配字元(可以包含*和?) public void Put(string strFolder, string strFileNameMask) { string[] strFiles = Directory.GetFiles(strFolder, strFileNameMask); foreach (string strFile in strFiles) { //strFile是完整的文件名(包含路徑) Put(strFile); } } /// /// 上傳一個文件 /// /// 本地文件名 public void Put(string strFileName) { if (!bConnected) { Connect(); } UpdateStatus = true; Socket socketData = CreateDataSocket(); SendCommand("STOR " + Path.GetFileName(strFileName)); if (!(iReplyCode == 125 || iReplyCode == 150)) { throw new IOException(strReply.Substring(4)); } FileStream input = new FileStream(strFileName, FileMode.Open); int iBytes = 0; long total = input.Length; long finished = 0; //DateTime startTime = DateTime.Now; double speed = 0; while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0) { Console.WriteLine(startTime.ToString()); socketData.Send(buffer, iBytes, 0); DateTime endTime = DateTime.Now; TimeSpan ts = endTime - startTime; finished += iBytes; Console.WriteLine(ts.Milliseconds); if (ts.Milliseconds > 0) { speed = (double)(finished / ts.TotalMilliseconds); speed = Math.Round(speed * 1000 / 1024, 2); } if (OnTransferProcess != null&&iBytes>0&&finished>0) { OnTransferProcess(total, finished,speed); } } UpdateStatus = false; finished = 0; input.Close(); if (socketData.Connected) { socketData.Close(); } if (!(iReplyCode == 226 || iReplyCode == 250)) { ReadReply(); if (!(iReplyCode == 226 || iReplyCode == 250)) { UpdateStatus = false; throw new IOException(strReply.Substring(4)); } } } #endregion #region 目錄操作 /// /// 創建目錄 /// /// 目錄名 public void MkDir(string strDirName) { if (!bConnected) { Connect(); } SendCommand("MKD " + strDirName); if (iReplyCode != 257) { throw new IOException(strReply.Substring(4)); } } /// /// 刪除目錄 /// /// 目錄名 public void RmDir(string strDirName) { if (!bConnected) { Connect(); } SendCommand("RMD " + strDirName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } /// /// 改變目錄 /// /// 新的工作目錄名 public void ChDir(string strDirName) { if (strDirName.Equals(".") || strDirName.Equals("")) { return; } if (!bConnected) { Connect(); } SendCommand("CWD " + strDirName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } this.strRemotePath = strDirName; } #endregion #region 內部變數 /// /// 伺服器返回的應答信息(包含應答碼) /// private string strMsg; /// /// 伺服器返回的應答信息(包含應答碼) /// private string strReply; /// /// 伺服器返回的應答碼 /// private int iReplyCode; /// /// 進行控制連接的socket /// private Socket socketControl; /// /// 傳輸模式 /// private TransferType trType; /// /// 接收和發送數據的緩沖區 /// private static int BLOCK_SIZE = Int16.MaxValue; Byte[] buffer = new Byte[BLOCK_SIZE]; /// /// 編碼方式(為防止出現中文亂碼採用 GB2312編碼方式) /// Encoding GB2312 = Encoding.Default ;//Encoding.GetEncoding("gb2312"); #endregion #region 內部函數 /// /// 將一行應答字元串記錄在strReply和strMsg /// 應答碼記錄在iReplyCode /// private void ReadReply() { strMsg = ""; strReply = ReadLine(); iReplyCode = Int32.Parse(strReply.Substring(0, 3)); } /// /// 建立進行數據連接的socket /// /// 數據連接socket private Socket CreateDataSocket() { SendCommand("PASV"); if (iReplyCode != 227) { throw new IOException(strReply.Substring(4)); } int index1 = strReply.IndexOf('('); int index2 = strReply.IndexOf(')'); string ipData = strReply.Substring(index1 + 1, index2 - index1 - 1); int[] parts = new int[6]; int len = ipData.Length; int partCount = 0; string buf = ""; for (int i = 0; i < len && partCount <= 6; i++) { char ch = Char.Parse(ipData.Substring(i, 1)); if (Char.IsDigit(ch)) buf += ch; else if (ch != ',') { throw new IOException("Malformed PASV strReply: " + strReply); } if (ch == ',' || i + 1 == len) { try { parts[partCount++] = Int32.Parse(buf); buf = ""; } catch (Exception) { throw new IOException("Malformed PASV strReply: " + strReply); } } } string ipAddress = parts[0] + "." + parts[1] + "." + parts[2] + "." + parts[3]; int port = (parts[4] << 8) + parts[5]; Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress), port); try { s.Connect(ep); } catch (Exception) { throw new IOException("無法連接伺服器"); } return s; } /// /// 關閉socket連接(用於登錄以前) /// private void CloseSocketConnect() { if (socketControl != null) { socketControl.Close(); socketControl = null; } bConnected = false; } /// /// 讀取Socket返回的所有字元串 /// /// 包含應答碼的字元串列 private string ReadLine() { while (true) { int iBytes = socketControl.Receive(buffer, buffer.Length, 0); strMsg += GB2312.GetString(buffer, 0, iBytes); if (iBytes < buffer.Length) { break; } } char[] seperator = { '
' }; string[] mess = strMsg.Split(seperator); if (strMsg.Length > 2) { strMsg = mess[mess.Length - 2]; //seperator[0]是10,換行符是由13和0組成的,分隔後10後面雖沒有字元串, //但也會分配為空字元串給後面(也是最後一個)字元串數組, //所以最後一個mess是沒用的空字元串 //但為什麼不直接取mess[0],因為只有最後一行字元串應答碼與信息之間有空格 } else { strMsg = mess[0]; } if (!strMsg.Substring(3, 1).Equals(" "))//返回字元串正確的是以應答碼(如220開頭,後面接一空格,再接問候字元串) { return ReadLine(); } return strMsg; } /// /// 發送命令並獲取應答碼和最後一行應答字元串 /// /// 命令 private void SendCommand(String strCommand) { Byte[] cmdBytes = GB2312.GetBytes((strCommand + "\r
").ToCharArray()); socketControl.Send(cmdBytes, cmdBytes.Length, 0); ReadReply(); } #endregion } }

D. 易語言如何下載FTP裡面文件夾下面的文件夾的文件

cnt = FTP目錄列表 (子文件夾下的目錄, , 目錄, , , )

首先確定您的FTP跟目錄,可通過下圖得到跟目錄

一般格式是: [IP]地址 或者 [帳號名] 比如:fsdf1321

假如跟目錄下有個文件夾:temp temp還有各子夾temp2 ,那麼其路徑為:

根目錄 emp emp2

cnt = FTP目錄列表 (根目錄 emp emp2, , 目錄, , , )

其他不變

E. Bat腳本處理ftp超強案例分析

前言 公司有幾百台windows伺服器 每次程序更新 如果是一台台拷數據 只怕安排十個人 一天都不一定做得完 所以就必須研究個全自動更新方案來 於是就想到了FTP 做個主FTP站 在幾百台客戶機上啟動BAT腳本 每 秒檢測一次 如果主站有更新程序 就自動下載更新 幾分鍾內 上 台windows伺服器 都可以全自動更新程序完畢 相當實用 現把當初研究BAT的腳本思路貼出來 希望對大批量運維人員一個方向 當然 批量更新伺服器 每個公司有它自己的解決辦法 這個BAT的方式不是最優的 可以用shell 可以用perl 也可以用python等腳本解決 一 FTP命令說明 在windows系統中因為FTP是一個程序 如果在bat腳本中直接調用FTP的命令 在執行時總會彈出命令行窗口 循環在>FTP游標這 所以要換種方式 利用 S:filename 更多的命令請輸入 h查看 FTP登錄成功後 需要下載遠程單個文件時 使用get命令 如果下載多個文件時 用mget 它支持通配符 在使用mget時 需要對每一個文件都進行選擇Y/N 如果想不交互的下載全部的文件 可以輸入一次prompt命令關閉交互方式 Mput和mget命令要注意兩個問題 Ⅰ 不能對目標文件指定命字 在命令行上所有的文件都視做源文件 Ⅱ mput mget兩個命令不能對目錄進行上傳與下載 只能對文件 Ⅲ Prompt 每次執行一個這個命令 就在on off之間循環 ftp腳本開始時 prompt默認為on 所以一般在上傳 下載文件時 執行一次prompt 把互動式的on關掉 變為off 文件的傳輸方式 Binary 二進制傳輸 Ascii ascII傳輸 在FTP文件傳輸過程中 ASCII傳輸HTML和文本編寫的文件 而二進制碼傳輸可以傳送文本和非文本(執行文件 壓縮文件 圖片等) 具有通用性 二進制碼傳輸速度比ASCII傳輸要快 所以在建立bat腳本時 一般輸入bin命令 啟用二進制傳輸 如果用ASCII模式傳輸非文本文件 可能會顯示一堆亂碼 如果是上傳一些CGI腳本 有可能將無法運行這類腳本 而在瀏覽器上看到server error的錯誤 Ascii和binary模式的區別是回車換行的處理 binary模式不對數據進行任何處理 asci模式將回車換行轉換為本機的回車字元 比如Unix下是 Windows下是 Mac下是 unix系統下行結束符是一個位元組 即十六進制的 A 而ms的系統是兩個位元組 即十六進制的 D A 所以當你用ascii方式從unix的ftp server下載文件時(不管是二進制或者文本文件 redhat的 vsftp默認是binary ascii默認關閉) 每檢測到一個位元組是 A 就會自動插入一個 D 所以如果你的文件是二進制文件比如可執行文件 壓縮包什麼的 就肯定不能用了 如果你的文件就是unix下的文本文件 你用 ascii模式是正確的 要是誤用了binary模式 你在windows上看這個文件是沒有換行的 裡面是一個個的黑方塊 在用FTP客戶端傳輸文件時 因為這些軟體都做得比較智能化 它可以根據後綴 自動啟用傳輸模式 所以不用擔心出問題 二 實例求證 環境說明 上有一FTP伺服器端(windows版) FTP用戶名為lgh 密碼為 該用戶的根目錄為D lgh 裡面文件見下圖 sql rar是sql bat的壓縮文件 大家注意看圖 我等下會在後面的實例中引用這個文件 把mget get prompt bin ascii等ftp命令詮釋得一清二白

實例一 直接BAT調用FTP命令 ftpbat bat內容 (***大家建立bat文件不要命名為ftp bat 執行時會有問題***)

復制代碼 代碼如下:

ftp open lgh get sql rar bye

從圖上的結果看 bat腳本直接調用xp的FTP命令是不行的 執行時H:>ftp會一直死循環 我這里的XP系統是SP 的 其它版本的 我沒有作測試 如果有不同 歡迎大家留言告之 實例二 用put get上傳 下載單個文件 把XP機器上H:js目錄下文件flower zip上傳到FTP伺服器 把FTP伺服器中的sql rar文件下載到XP機器上的H:JS目錄 ftp get put bat內容如下

復制代碼 代碼如下:

@echo off set ftpfilename=autoftp cfg echo open > %ftpfilename% echo lgh >> %ftpfilename% echo >> %ftpfilename% echo bin >> %ftpfilename% echo lcd h:js >> %ftpfilename% echo get sql rar >> %ftpfilename% echo put flower zip >> %ftpfilename% echo bye >> %ftpfilename% ftp s: %ftpfilename% del %ftpfilename%

我們來看看結果 見下面兩張圖 從XP系統上看 H盤的JS目錄 多了個sql rar FTP伺服器上的根目錄多了個flower zip 這說明 剛才的腳本完成正常的執行了 達到了預期的目的

實例三 用put get上傳 下載多個文件 在XP機器上把flower zip復制一次 改名為flower zip 在XP機器上把把第二次實例下載的sql rar文件刪除 以免影響到本次操作 在FTP伺服器上把第二次實例上傳的flower zip文件刪除 以免影響到本次操作 把XP機器上H:js目錄下文件flower zip 和flower zip上傳到FTP伺服器 ftp get put many bat內容如下

復制代碼 代碼如下:

@echo off set ftpfilename=autoftp cfg echo open > %ftpfilename% echo lgh >> %ftpfilename% echo >> %ftpfilename% echo bin >> %ftpfilename% echo lcd h:js >> %ftpfilename% echo put flower zip flower zip>> %ftpfilename% echo bye >> %ftpfilename% ftp s: %ftpfilename% del %ftpfilename%

到FTP伺服器上查看根目錄 看flower zip與flower zip是否已成功上傳 從圖上看 只成功上傳了flower zip文件

剛那個ftp get put many bat腳本里echo put flower zip flower zip>> %ftpfilename% flower zip是傳輸的最後一個文件 是不是用put時 意味著bat在處理上傳時 只認最後一個文件呢 我們再多加個文件flower zip 來驗證

在XP機器上把flower zip復制一次 改名為flower zip在FTP伺服器上把第二次實例上傳的flower zip文件刪除 以免影響到本次操作

ftp get put many bat內容修改如下

復制代碼 代碼如下:

@echo off set ftpfilename=autoftp cfg echo open > %ftpfilename% echo lgh >> %ftpfilename% echo >> %ftpfilename% echo bin >> %ftpfilename% echo lcd h:js >> %ftpfilename% echo put flower zip flower zip flower zip>> %ftpfilename% echo bye >> %ftpfilename% ftp s: %ftpfilename% del %ftpfilename%

結果 還是只成功上傳了flower zip 因bat雙擊時 執行過程會一閃而過 我們看不到執行過程 到命令行去執行下 看到底出了什麼問題

命令行 執行ftp get put many bat腳本 從執行情況看 flower zip三個文件都是put的 但在傳輸時 卻只傳了flower zip 真不解 有知道的朋友嗎?給點方向

再換個方式 用通配符* 試試 ftp get put many bat內容修改如下

復制代碼 代碼如下:

@echo off set ftpfilename=autoftp cfg echo open > %ftpfilename% echo lgh >> %ftpfilename% echo >> %ftpfilename% echo bin >> %ftpfilename% echo lcd h:js >> %ftpfilename% echo put flower* zip >> %ftpfilename% echo bye >> %ftpfilename% ftp s: %ftpfilename% del %ftpfilename%

在FTP伺服器上把上傳的flower文件全部刪除 以免影響到本次操作執行ftp get put many bat 結果只有flower zip文件上傳成功了 呵 flower zip文件 怎麼都不能上傳 ???

其實用put傳輸多個文件 完全可用重復的方式取代 比如 ftp get put many bat內容修改如下

復制代碼 代碼如下:

@echo off set ftpfilename=autoftp cfg echo open > %ftpfilename% echo lgh >> %ftpfilename% echo >> %ftpfilename% echo bin >> %ftpfilename% echo lcd h:js >> %ftpfilename% echo put flower zip >> %ftpfilename% echo put flower zip >> %ftpfilename% echo put flower zip >> %ftpfilename% echo bye >> %ftpfilename% ftp s: %ftpfilename% del %ftpfilename%

實例四 用mput mget上傳 下載多個文件 在FTP伺服器上刪除有關flower的文件

ftp mget mput many bat內容如下:

復制代碼 代碼如下:

@echo off set ftpfilename=autoftp cfg echo open > %ftpfilename% echo lgh >> %ftpfilename% echo >> %ftpfilename% echo bin >> %ftpfilename% echo lcd h:js >> %ftpfilename% echo mput flower zip flower zip flower zip>> %ftpfilename% echo bye >> %ftpfilename% ftp s: %ftpfilename% del %ftpfilename%

雙擊ftp mget mput many bat後 發現系統彈出一窗口後 就卡住了 停止不前

原因是用了mput命令 但沒有用Prompt關閉交互

ftp mget mput many bat內容修改如下:

復制代碼 代碼如下:

@echo off set ftpfilename=autoftp cfg echo open > %ftpfilename% echo lgh >> %ftpfilename% echo >> %ftpfilename% echo Prompt >> %ftpfilename% echo bin >> %ftpfilename% echo lcd h:js >> %ftpfilename% echo mput flower zip flower zip flower zip>> %ftpfilename% echo bye >> %ftpfilename% ftp s: %ftpfilename% del %ftpfilename%

再次執行ftp mget mput many bat 結果見下圖

用通配符*試試在FTP伺服器上刪除有關flower的文件ftp mget mput many bat內容修改如下:

復制代碼 代碼如下:

@echo off set ftpfilename=autoftp cfg echo open > %ftpfilename% echo lgh >> %ftpfilename% echo >> %ftpfilename% echo Prompt >> %ftpfilename% echo bin >> %ftpfilename% echo lcd h:js >> %ftpfilename% echo mput flower* zip >> %ftpfilename% echo bye >> %ftpfilename% ftp s: %ftpfilename% del %ftpfilename%

照樣成功上傳有關flower* zip文件 因為結果與上一步是一樣的 所以就不抓圖了 實例五 用ascii在windows系統間傳輸非文本文件 把XP電腦上的rmb jpg通過ascii傳到FTP伺服器的根目錄

ftp get ascii bat內容修改如下:

復制代碼 代碼如下:

@echo off set ftpfilename=autoftp cfg echo open > %ftpfilename% echo lgh >> %ftpfilename% echo >> %ftpfilename% echo ascii >> %ftpfilename% echo lcd h:js >> %ftpfilename% echo put rmb jpg>> %ftpfilename% echo bye >> %ftpfilename% ftp s: %ftpfilename% del %ftpfilename%

執行ftp get ascii bat後 發現rmb jpg可以正常上傳 並且可以正常打開 那 這個現象與前面所以的ascii不能傳輸非文本東西有出入 這是怎麼回會事呢 這是因為 FTP伺服器是WINDOWS系統 XP電腦上的bat腳本也是在windows系統上運行的 所以bat在windows系統里用FTP傳輸文件 不管是用ascii 還是用binary 都是可以的 接下來我們再做一個實驗 FTP伺服器選centos 再測下ascii傳輸非文本文件問題 實例六 用ascii在windows系統與linux系統間傳輸非文本文件 在RHEL 位系統上建立一vsftpd伺服器 上面說過redhat默認啟用二進制傳輸 關閉了ascii碼傳輸 所以我們還要修改一下vsftpd的配置文件 修改/etc/vsftpd/nf文件 允許客戶端進行ascii傳輸 並重啟vsftpd

把rmb jpg放到FTP伺服器 大家注意下H:js目錄下只有ftp getascii bat文件

ftp getascii bat文件內容修改如下

復制代碼 代碼如下:

@echo off set ftpfilename=autoftp cfg echo open > %ftpfilename% echo ftp >> %ftpfilename% echo redhat >> %ftpfilename% echo asc >> %ftpfilename% echo lcd h:js >> %ftpfilename% echo get rmb jpg >> %ftpfilename% echo bye >> %ftpfilename% ftp s: %ftpfilename% del %ftpfilename%

執行ftp getascii bat 看結果 rmb jpg文件有下載到XP電腦里 雙擊這個文件 發現圖像亂碼 文件被破壞了 都是ascii碼傳輸惹的禍

換bin傳輸 測試一下在XP電腦上刪除rmb jpg文件 再雙擊ftp getascii bat文件 去從LINUX的FTP伺服器下載一個rmb jpg文件

修改ftp getascii bat 把ascii改給二進制傳輸

復制代碼 代碼如下:

@echo off set ftpfilename=autoftp cfg echo open > %ftpfilename% echo ftp >> %ftpfilename% echo redhat >> %ftpfilename% echo bin >> %ftpfilename% echo lcd h:js >> %ftpfilename% echo get rmb jpg >> %ftpfilename% echo bye >> %ftpfilename% ftp s: %ftpfilename% del %ftpfilename%

結果 文件正常下載 圖像也顯示正常 lishixin/Article/program/qrs/201401/30223

F. FTP該如何實現斷點續傳

客戶端的實現步驟如下:
一、下載:
1、向伺服器發送「REST + 本地文件長度」命令,告訴伺服器,客戶端要斷點下載了。這時伺服器還不知道客戶端要下載哪個文件;
要實現FTP的斷點續傳,FTP伺服器必須支持REST指令,這條指令在FTP協議文本RFC959中就已經定義了,不過它不是FTP伺服器必須支持的指令。一般,你可以在下載前使用REST 100命令進行實驗,如果伺服器正常執行了這條命令,說明該伺服器支持FTP斷點續傳。REST後面跟的數表示下載文件的起始位置,而REST 0表示從文件最開始處下載。REST命令本身並不執行下載功能,你仍需要使用RETR命令執行下載工作。
2、向伺服器發送「RETR + 文件名」命令,通知伺服器要下載的文件名,這時伺服器開始定位文件指針讀文件並發送數據。
3、客戶端定位本地文件指針(文件末尾);
4、兩端的准備工作都做完了以後,客戶端創建socket,以被動或非被動方式建立數據通道,循環調用recv接收數據並追加入本地文件;
二、上傳:
1、獲取伺服器上和本地要上傳文件的同名文件大小;
2、向伺服器發送「APPE + 文件名」,通知伺服器,接下來從數據通道發送給你的數據要附加到這個文件末尾。
3、定位本地文件指針(和FTP上文件大小相同的位置)
4、從文件指針處讀數據並發送。
代碼里將斷點上傳和斷點下載放到同一個函數(MoveFile)里,通過get參數說明是上傳還是下載。

G. 易語言FTP下載文件夾里的全部文件

.版本 2
.支持庫 internet

.程序集 窗口程序集1
.程序集變數 目錄, 文本型, , "0"
.程序集變數 cnt, 整數型
.程序集變數 tmp, 整數型

.子程序 _按鈕1_被單擊

.如果真 (連接FTP伺服器 (「Ftp IP」, 「賬號」, 「密碼」, 21, ) = 真)
編輯框1.內容 = 編輯框1.內容 + 「Ftp已連接」
.如果真結束
.如果真 (FTP置現行目錄 (「你要進入的目錄」) = 真)
編輯框1.內容 = 編輯框1.內容 + #換行符 + 「進入目錄」
.如果真結束
cnt = FTP目錄列表 (「*.*」, , 目錄, , , )
.計次循環首 (cnt, tmp)
編輯框1.內容 = 編輯框1.內容 + #換行符 + 目錄 [tmp]
.計次循環尾 ()

.子程序 _按鈕2_被單擊

編輯框1.內容 = 編輯框1.內容 + #換行符 + 「---------------------------------------」
.計次循環首 (cnt, tmp)
FTP文件下載 (目錄 [tmp], 取運行目錄 () + 「/」 + 目錄 [tmp], )
編輯框1.內容 = 編輯框1.內容 + #換行符 + 「下載文件:」 + 取運行目錄 () + 「/」 + 目錄 [tmp]
.計次循環尾 ()

H. ftp限速參數

你可以這樣,如果伺服器端系統級不能修改你可以在你本地端使用iptables等約束你自己對外的帶寬不就可以了么?

I. 如何批量從ftp批量下載文件

如果你是WIN系統或者Linux系統自帶的FTP,就是用代碼循環。

你用的是客戶端的話更簡單了,把需要下載的勾選的直接下就可以了,比如這款IIS7伺服器管理軟體。

它的操作簡單,功能強大可應用於win系列的操作系統(含VPS、VM);還可應用於linux操作系統:CentOS、Ubuntu、Debian等,支持命令及可視化SFTP管理;linux的vnc、win的vnc;FTP,webshell等,同時適合機房管理、站長、運維工作、程序員,等需要大量伺服器或者電腦的用戶朋友使用范圍很廣。
IIS7伺服器管理工具能夠作為FTP的客戶端,進行FTP的命令操作,定時備份上傳下載,自動更新。可在客戶端,下載,安裝FTP軟體!同時,它也可以作為VNC的客戶端,進行VNC的命令操作!它能夠批量連接Windows和Linux系統下的伺服器和VPS,並能夠實時監測他們的連接狀態,便於日常維護和操作!

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:645
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:936
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:632
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:821
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:731
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1066
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:299
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:160
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:851
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:763