C# 获取Ftp某个目录下的所有文件(不要文件夹)

C# 获取Ftp某个目录下的所有文件(不要文件夹),第1张

我在之前做过一个FTP的客户端工具。

drw 文件

-rw文件(有扩展名或无扩展名)

我是根据服务端返回的报文进行分析获取的列表。

给你一些代码片段:

/// <summary>

/// 获取指定目录下的文件和文件夹

/// </summary>

/// <param name="path">要获取的目录</param>

/// <param name="WRMethods">要发送到FTP服务器的密令。</param>

/// <returns></returns>

public string[] GetFileList(string path, string WRMethods)//从ftp服务器上获得文件列表

{

WebResponse response

string[] downloadFiles

int conut = 4

StringBuilder result = new StringBuilder()

Connect(path)

if (FTPVariable.IsUseProxy_ftp)

{

reqFTP.Proxy = FtpProxy.GetFtpSelectProxy(FTPVariable.FtpCommand_transferProxyName)

}

reqFTP.ReadWriteTimeout = 12000

//如果不应销毁到服务器的连接,则为 true;否则为 false。默认值为 true。

//

reqFTP.Method = WRMethods

try

{

response = (FtpWebResponse)reqFTP.GetResponse()

goto Ftp_lbl_03

}

catch (WebException webex)

{

GetReply(webex.Message)

if (ReplyCode == 530)// 未登录。

{

goto Ftp_lbl_04

}

else if (ReplyCode == 550)

{

goto Ftp_lbl_04

}

else

{

FtpManage.SetLog("获取列表超时,等候1秒后重试!")

goto Ftp_lbl_01

}

}

Ftp_lbl_01:

try

{

FtpManage.SetLog("正在连接服务器 " + FtpRemoteHost)

response = GetRequest(path, WRMethods)

}

catch (WebException)

{

FtpManage.SetLog("获取列表超时,等候1秒后重试!")

downloadFiles = null

System.Threading.Thread.Sleep(1000)

if (conut == 0)

{

goto Ftp_lbl_02

}

conut--

goto Ftp_lbl_01

}

catch (Exception ex)

{

MSG.Show(ex.Message, Global.GetRS["msgTilteError"], MessageBoxButton.OK, MsgIco.Error)

FtpManage.SetLog("命令执行失败,原因:" + ex.Message)

downloadFiles = null

return downloadFiles

}

Ftp_lbl_03:

StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default)//中文文件名

string line = reader.ReadLine()

while (line != null)

{

result.Append(line)

result.Append("\n")

line = reader.ReadLine()

}

if (result.Length == 0)

{

return null

}

// to remove the trailing '\n'

result.Remove(result.ToString().LastIndexOf('\n'), 1)

reader.Close()

response.Close()

FtpManage.SetLog("命令已成功执行")

return result.ToString().Split('\n')

Ftp_lbl_04:

FtpManage.SetLog(ReplyInfo)

return null

Ftp_lbl_02:

FtpManage.SetLog("550 获取列表失败,无法连接远程服务器!")

FtpManage.ftpmanage.IsRefurbish = true

return null

}

/// <summary>

/// 获取指定目录下的文件和文件夹。

/// </summary>

/// <param name="path">要获取的目录</param>

/// <returns></returns>

public string[] GetFileList(string path)//从ftp服务器上获得文件列表

{

return GetFileList(FTPVariable.FtpURLhead + FtpRemoteHost + "/" + path, WebRequestMethods.Ftp.ListDirectory)

}

/// <summary>

/// 获取指定目录下的文件和文件夹。

/// </summary>

/// <returns></returns>

public string[] GetFileList()//从ftp服务器上获得文件列表

{

return GetFileList(FTPVariable.FtpURLhead + FtpRemoteHost + "/", WebRequestMethods.Ftp.ListDirectory)

}

/// <summary>

/// 获取目录和文件名,返回目录表。

/// </summary>

/// <param name="path">要获取的目录</param>

/// <returns></returns>

public string[] GetCatalog_FileList(string path)

{

string[] fountainhead = GetFileList(FTPVariable.FtpURLhead + FtpRemoteHost + "/" + path, WebRequestMethods.Ftp.ListDirectoryDetails)

string[] Catalog = null

if (fountainhead == null)

{

return null

}

Catalog = new string[fountainhead.Length]

for (int i = 3i <fountainhead.Lengthi++)

{

Catalog[i - 3] += fountainhead[i].Substring(55, fountainhead[i].Length - 55) + "&"//FileName

Catalog[i - 3] += fountainhead[i].Substring(30, 12) + "&"//FileSize

Catalog[i - 3] += fountainhead[i].Substring(42, 13) + "&"//AmendDate

Catalog[i - 3] += fountainhead[i].Substring(0, 3) + "&"

}

return Catalog

}

1.C语言可以使用CStdioFile函数打开本地文件。使用类CInternetSession 创建并初始化一个Internet打开FTP服务器文件。

  CStdioFile继承自CFile,一个CStdioFile 对象代表一个用运行时函数fopen 打开的C 运行时流式文件。

流式文件是被缓冲的,而且可以以文本方式(缺省)或二进制方式打开。文本方式提供对硬回车—换行符对的特殊处理。当你将一个换行符(0x0A)写入一个文本方式的CStdioFile 对象时,字节对(0x0D,0x0A)被发送给该文件。当你读一个文件时,字节对(0x0D,0x0A)被翻译为一个字节(0x0A)。

CStdioFile 不支持Duplicate,LockRange,和UnlockRange 这几个CFile 函数。如果在CStdioFile 中调用了这几个函数,将会出现CNoSupported 异常。

使用类CInternetSession 创建并初始化一个或多个同时的Internet 会话。如果需要,还可描述与代理服务器的连接。

如果Internet连接必须在应用过程中保持着,可创建一个类CWinApp的CInternetSession成员。一旦已建立起Internet 会话,就可调用OpenURL。CInternetSession会通过调用全局函数AfxParseURL来为分析映射URL。无论协议类型如何,CInternetSession 解释URL并管理它。它可处理由URL资源“file://”标志的本地文件的请求。如果传给它的名字是本地文件,OpenURL 将返回一个指向CStdioFile对象的指针。

如果使用OpenURL在Internet服务器上打开一个URL,你可从此处读取信息。如果要执行定位在服务器上的指定的服务(例如,HTTP,FTP或Gopher)行为,必须与此服务器建立适当的连接。

2.例程:

#include <winsock.h>

#include <stdio.h>

WORD wVersionRequested

WSADATA wsaData

char name[255] //name里是本机名

CString ip //本机IP

PHOSTENT hostinfo

wVersionRequested = MAKEWORD( 1, 1 )

if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )

{

if( gethostname ( name, sizeof(name)) == 0)

  {

if((hostinfo = gethostbyname(name)) != NULL)

{

ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list)

}

}

WSACleanup( )

}  

// AfxMessageBox(name)//name里是本机名

// AfxMessageBox(ip) //ip中是本机IP

CStdioFile File

File.Open("C://ip.txt",CFile::modeCreate|CFile::modeReadWrite)

//如果文件事先不存在的话,就需要CFile::modeCreate,否则就不需要。

File.WriteString(ip+":"+"8000")

File.Close()  //注意,这里一定要把文件关闭,否则不能成功上传

CString host="204.45.67.11"  

  CString user="19337"  

  CString password="1234567"  

  TRACE(":%s:%s:%s:%s/n", host,   

user, password, "C://ip.txt")  

  CInternetSession session  

(AfxGetApp()->m_pszAppName)  

  CFtpConnection* pConn = NULL  

  pConn = session.GetFtpConnection (host,user,password)  

  if (pConn) {  

if (!pConn->PutFile("C://ip.txt","ip.txt"))

{  

MessageBox("传送文件失败??")  

} else {  

MessageBox("传送文件成功!")  

}  

pConn->Close()  

delete pConn  

session.Close()  

  } else {  

MessageBox("Cannot Connect")  

  }


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11500159.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存