C# 用C语言将文件从FTP读取到内存#
我想从FTP服务器读取文件,而不将其下载到本地文件。我编写了一个函数,但它不起作用:C# 用C语言将文件从FTP读取到内存#,c#,.net,ftp,webclient,C#,.net,Ftp,Webclient,我想从FTP服务器读取文件,而不将其下载到本地文件。我编写了一个函数,但它不起作用: private string GetServerVersion() { WebClient request = new WebClient(); string url = FtpPath + FileName; string version = ""; request.Credentials = new NetworkCredential(ftp_user, ftp_pas)
private string GetServerVersion()
{
WebClient request = new WebClient();
string url = FtpPath + FileName;
string version = "";
request.Credentials = new NetworkCredential(ftp_user, ftp_pas);
try
{
byte[] newFileData = request.DownloadData(new Uri(FtpPath)+FileName);
string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
}
catch (WebException e)
{
}
return version;
}
如果没有关于错误/异常的详细信息,就不可能知道问题是什么 猜测一下,您似乎没有在初始声明之后为
version
分配新值
string version = "";
尝试将代码更改为
version = System.Text.Encoding.UTF8.GetString(newFileData);
上面的代码与我两天前发现并使用的另一个Stackoverlow示例非常相似。如果您正确设置了URI、用户和密码,它将下载文件并将内容设置为FileString。我不知道你想在不下载的情况下阅读文件是什么意思。这不是一个真正的选择 如果您想查看文件属性(我看到您提到了“版本”),可以使用下面的代码从FTP服务器获取所有文件名、数据和大小,而无需下载文件 调用GetFileInfo并输入文件名(确保按照代码设置完整的FTP路径、用户和密码)。这将返回一个带有名称、日期和大小的FTPFileInfo对象
public static FTPFileInfo GetFileInfo(string fileName)
{
var dirInfo = WordstockExport.GetFTPDirectoryDetails();
var list = FTPFileInfo.Load(dirInfo);
try
{
FTPFileInfo ftpFile = list.SingleOrDefault(f => f.FileName == fileName);
return ftpFile;
}
catch { }
return null;
}
class FTPFileInfo
{
private DateTime _FileDate;
private long _FileSize;
private string _FileName;
public DateTime FileDate
{
get { return _FileDate; }
set { _FileDate = value; }
}
public long FileSize
{
get { return _FileSize; }
set { _FileSize = value; }
}
public string FileName
{
get { return _FileName; }
set { _FileName = value; }
}
public FTPFileInfo() { }
public static FTPFileInfo LoadFromLine(string line)
{
FTPFileInfo file = new FTPFileInfo();
string[] ftpFileInfo = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
file._FileDate = DateTime.Parse(ftpFileInfo[0] + " " + ftpFileInfo[1]);
file._FileSize = long.Parse(ftpFileInfo[2]);
file._FileName = ftpFileInfo[3];
return file;
}
public static List<FTPFileInfo> Load(string listDirectoryDetails)
{
List<FTPFileInfo> files = new List<FTPFileInfo>();
string[] lines = listDirectoryDetails.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach(var line in lines)
files.Add(LoadFromLine(line));
return files;
}
}
private static string GetFTPDirectoryDetails()
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(App.Export_FTPPath);
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
request.Credentials = new NetworkCredential(App.FTP_User, App.FTP_Password);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string fileLines = reader.ReadToEnd();
reader.Close();
response.Close();
return fileLines;
}
public静态FTPFileInfo GetFileInfo(字符串文件名)
{
var dirInfo=WordstockExport.GetFTPDirectoryDetails();
var list=FTPFileInfo.Load(dirInfo);
尝试
{
FTPFileInfo ftpFile=list.SingleOrDefault(f=>f.FileName==FileName);
返回ftpFile;
}
捕获{}
返回null;
}
类FTPFileInfo
{
私有日期时间_FileDate;
私有长文件大小;
私有字符串\u文件名;
公共日期时间文件日期
{
获取{return\u FileDate;}
设置{u FileDate=value;}
}
公共长文件大小
{
获取{return\u FileSize;}
设置{u FileSize=value;}
}
公共字符串文件名
{
获取{return\u FileName;}
设置{u FileName=value;}
}
公共FTPFileInfo(){}
公共静态FTPFileInfo LoadFromLine(字符串行)
{
FTPFileInfo file=新的FTPFileInfo();
string[]ftpFileInfo=line.Split(“.ToCharArray(),StringSplitOptions.removeMptyEntries”);
file._FileDate=DateTime.Parse(ftpFileInfo[0]+“”+ftpFileInfo[1]);
file._FileSize=long.Parse(ftpFileInfo[2]);
文件。_FileName=ftpFileInfo[3];
返回文件;
}
公共静态列表加载(字符串listDirectoryDetails)
{
列表文件=新列表();
string[]lines=listDirectoryDetails.Split(“\r\n”.toCharray(),StringSplitOptions.RemoveEmptyEntries”);
foreach(行中的var行)
添加(LoadFromLine(line));
归还文件;
}
}
私有静态字符串GetFTPDirectoryDetails()
{
FtpWebRequest=(FtpWebRequest)WebRequest.Create(App.Export\u FTPPath);
request.Method=WebRequestMethods.Ftp.ListDirectoryDetails;
request.Credentials=新的网络凭据(App.FTP\u用户,App.FTP\u密码);
FtpWebResponse response=(FtpWebResponse)request.GetResponse();
Stream responseStream=response.GetResponseStream();
StreamReader=新的StreamReader(responseStream);
string fileLines=reader.ReadToEnd();
reader.Close();
response.Close();
返回文件行;
}
下面是一个简单的工作示例,使用您的代码从Microsoft公共FTP服务器获取文件:
WebClient request = new WebClient();
string url = "ftp://ftp.microsoft.com/developr/fortran/" +"README.TXT";
request.Credentials = new NetworkCredential("anonymous", "anonymous@example.com");
try
{
byte[] newFileData = request.DownloadData(url);
string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
Console.WriteLine(fileString);
}
catch (WebException e)
{
// Do something such as log error, but this is based on OP's original code
// so for now we do nothing.
}
我估计您的代码中这一行缺少斜杠:
string url = FtpPath + FileName;
可能在
FtpPath
和FileName
之间?C夏普GUI应用程序。最小的ftp传输,不优雅,但工作正常。
GUI,而不是控制台
来自noaa的天气预报。找到你的区域(寻找你的metar)!
METAR天气报告主要用于飞行员完成飞行前的部分任务
使用vs 2012 premium RC构建(2012年7月)
(单击标签,而不是按钮)
我们可以使用下面的方法从ftp获取文件属性,而无需下载文件。这对我来说很好
public DataTable getFileListFTP(string serverIP,string userID,string Password)
{
DataTable dt = new DataTable();
string[] fileListArr;
string fileName = string.Empty;
long fileSize = 0;
// DateTime creationDate;
string creationDate;
FtpWebRequest Request = (FtpWebRequest)WebRequest.Create(serverIP);
Request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
Request.Credentials = new NetworkCredential(userID,Password);
FtpWebResponse Response = (FtpWebResponse)Request.GetResponse();
Stream ResponseStream = Response.GetResponseStream();
StreamReader Reader = new StreamReader(ResponseStream);
dt.Columns.Add("FileName", typeof(String));
dt.Columns.Add("FileSize", typeof(String));
dt.Columns.Add("CreationDate", typeof(DateTime));
//CultureInfo c = new CultureInfo("ES-ES");
while (!Reader.EndOfStream)//Read file name
{
fileListArr = Convert.ToString(Reader.ReadLine()).Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
fileSize = long.Parse(fileListArr[4]);
creationDate = fileListArr[6] + " " + fileListArr[5] + " " + fileListArr[7];
//creationDate =Convert.ToDateTime(fileListArr[6] + " " + fileListArr[5] + " " + fileListArr[7], c).ToString("dd/MMM/yyyy", DateTimeFormatInfo.InvariantInfo);
fileName = Convert.ToString(fileListArr[8]);
DataRow drow = dt.NewRow();
drow["FileName"] = fileName;
drow["FileSize"] = fileName;
drow["CreationDate"] = creationDate;
dt.Rows.Add(drow);
}
Response.Close();
ResponseStream.Close();
Reader.Close();
return dt;
}
我知道这是一个老问题,但我想我建议下一个读这篇文章的人使用path.combine。有助于解决此类问题
string url = Path.Combine("ftp://ftp.microsoft.com/developr/fortran", "README.TXT");
看看我的FTP类,它可能正是您所需要的
Public Class FTP
'-------------------------[BroCode]--------------------------
'----------------------------FTP-----------------------------
Private _credentials As System.Net.NetworkCredential
Sub New(ByVal _FTPUser As String, ByVal _FTPPass As String)
setCredentials(_FTPUser, _FTPPass)
End Sub
Public Sub UploadFile(ByVal _FileName As String, ByVal _UploadPath As String)
Dim _FileInfo As New System.IO.FileInfo(_FileName)
Dim _FtpWebRequest As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create(New Uri(_UploadPath)), System.Net.FtpWebRequest)
_FtpWebRequest.Credentials = _credentials
_FtpWebRequest.KeepAlive = False
_FtpWebRequest.Timeout = 20000
_FtpWebRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile
_FtpWebRequest.UseBinary = True
_FtpWebRequest.ContentLength = _FileInfo.Length
Dim buffLength As Integer = 2048
Dim buff(buffLength - 1) As Byte
Dim _FileStream As System.IO.FileStream = _FileInfo.OpenRead()
Try
Dim _Stream As System.IO.Stream = _FtpWebRequest.GetRequestStream()
Dim contentLen As Integer = _FileStream.Read(buff, 0, buffLength)
Do While contentLen <> 0
_Stream.Write(buff, 0, contentLen)
contentLen = _FileStream.Read(buff, 0, buffLength)
Loop
_Stream.Close()
_Stream.Dispose()
_FileStream.Close()
_FileStream.Dispose()
Catch ex As Exception
MessageBox.Show(ex.Message, "Upload Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Public Sub DownloadFile(ByVal _FileName As String, ByVal _ftpDownloadPath As String)
Try
Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpDownloadPath)
_request.KeepAlive = False
_request.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
_request.Credentials = _credentials
Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
Dim responseStream As System.IO.Stream = _response.GetResponseStream()
Dim fs As New System.IO.FileStream(_FileName, System.IO.FileMode.Create)
responseStream.CopyTo(fs)
responseStream.Close()
_response.Close()
Catch ex As Exception
MessageBox.Show(ex.Message, "Download Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Public Function GetDirectory(ByVal _ftpPath As String) As List(Of String)
Dim ret As New List(Of String)
Try
Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpPath)
_request.KeepAlive = False
_request.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails
_request.Credentials = _credentials
Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
Dim responseStream As System.IO.Stream = _response.GetResponseStream()
Dim _reader As System.IO.StreamReader = New System.IO.StreamReader(responseStream)
Dim FileData As String = _reader.ReadToEnd
Dim Lines() As String = FileData.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
For Each l As String In Lines
ret.Add(l)
Next
_reader.Close()
_response.Close()
Catch ex As Exception
MessageBox.Show(ex.Message, "Directory Fetch Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Return ret
End Function
Private Sub setCredentials(ByVal _FTPUser As String, ByVal _FTPPass As String)
_credentials = New System.Net.NetworkCredential(_FTPUser, _FTPPass)
End Sub
End Class
小型二进制文件
如果文件很小,最简单的方法是使用:
小文本文件 如果小文件是文本文件,请使用: 它假定文件内容采用UTF-8编码(普通ASCII文件也可以)。如果需要使用不同的编码,请使用
大二进制文件 如果文件很大,因此需要分块处理,而不是将其全部加载到内存中,请使用: 您还可以通过使用简化代码
大文本文件 如果大文件是文本文件,并且希望按行而不是按固定大小的块进行处理,请使用: 同样,这假设UTF-8编码。如果要使用其他编码,请使用 如前所述,您可以通过使用简化代码
流接口 不过,在许多情况下,您可能希望在使用API的某些API中使用下载的数据。在这种情况下,不使用上述任何解决方案,而是直接使用API中的
request.GetResponse().GetResponseStream()或WebClient.OpenRead
返回的流
例如,请参阅。目前我想读取fileString的值,但无法读取,稍后我将从文件中获取version的值
string url = Path.Combine("ftp://ftp.microsoft.com/developr/fortran", "README.TXT");
Public Class FTP
'-------------------------[BroCode]--------------------------
'----------------------------FTP-----------------------------
Private _credentials As System.Net.NetworkCredential
Sub New(ByVal _FTPUser As String, ByVal _FTPPass As String)
setCredentials(_FTPUser, _FTPPass)
End Sub
Public Sub UploadFile(ByVal _FileName As String, ByVal _UploadPath As String)
Dim _FileInfo As New System.IO.FileInfo(_FileName)
Dim _FtpWebRequest As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create(New Uri(_UploadPath)), System.Net.FtpWebRequest)
_FtpWebRequest.Credentials = _credentials
_FtpWebRequest.KeepAlive = False
_FtpWebRequest.Timeout = 20000
_FtpWebRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile
_FtpWebRequest.UseBinary = True
_FtpWebRequest.ContentLength = _FileInfo.Length
Dim buffLength As Integer = 2048
Dim buff(buffLength - 1) As Byte
Dim _FileStream As System.IO.FileStream = _FileInfo.OpenRead()
Try
Dim _Stream As System.IO.Stream = _FtpWebRequest.GetRequestStream()
Dim contentLen As Integer = _FileStream.Read(buff, 0, buffLength)
Do While contentLen <> 0
_Stream.Write(buff, 0, contentLen)
contentLen = _FileStream.Read(buff, 0, buffLength)
Loop
_Stream.Close()
_Stream.Dispose()
_FileStream.Close()
_FileStream.Dispose()
Catch ex As Exception
MessageBox.Show(ex.Message, "Upload Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Public Sub DownloadFile(ByVal _FileName As String, ByVal _ftpDownloadPath As String)
Try
Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpDownloadPath)
_request.KeepAlive = False
_request.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
_request.Credentials = _credentials
Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
Dim responseStream As System.IO.Stream = _response.GetResponseStream()
Dim fs As New System.IO.FileStream(_FileName, System.IO.FileMode.Create)
responseStream.CopyTo(fs)
responseStream.Close()
_response.Close()
Catch ex As Exception
MessageBox.Show(ex.Message, "Download Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Public Function GetDirectory(ByVal _ftpPath As String) As List(Of String)
Dim ret As New List(Of String)
Try
Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpPath)
_request.KeepAlive = False
_request.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails
_request.Credentials = _credentials
Dim _response As System.Net.FtpWebResponse = _request.GetResponse()
Dim responseStream As System.IO.Stream = _response.GetResponseStream()
Dim _reader As System.IO.StreamReader = New System.IO.StreamReader(responseStream)
Dim FileData As String = _reader.ReadToEnd
Dim Lines() As String = FileData.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
For Each l As String In Lines
ret.Add(l)
Next
_reader.Close()
_response.Close()
Catch ex As Exception
MessageBox.Show(ex.Message, "Directory Fetch Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Return ret
End Function
Private Sub setCredentials(ByVal _FTPUser As String, ByVal _FTPPass As String)
_credentials = New System.Net.NetworkCredential(_FTPUser, _FTPPass)
End Sub
End Class
Dim ftp As New FORM.FTP("username", "password")
ftp.UploadFile("c:\file.jpeg", "ftp://domain/file.jpeg")
ftp.DownloadFile("c:\file.jpeg", "ftp://ftp://domain/file.jpeg")
Dim directory As List(Of String) = ftp.GetDirectory("ftp://ftp.domain.net/")
ListBox1.Items.Clear()
For Each item As String In directory
ListBox1.Items.Add(item)
Next
WebClient client = new WebClient();
string url = "ftp://ftp.example.com/remote/path/file.zip";
client.Credentials = new NetworkCredential("username", "password");
byte[] contents = client.DownloadData(url);
string contents = client.DownloadString(url);
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;
using (Stream stream = request.GetResponse().GetResponseStream())
{
byte[] buffer = new byte[10240];
int read;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
// process the chunk in "buffer"
}
}
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.txt");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;
using (Stream stream = request.GetResponse().GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
// process the line
Console.WriteLine(line);
}
}