0

好的,所以我想使用 c# 2010 向我的 drivehq ftp 服务器发送一个文件.dat 文件到 ftp 没有损坏请帮助

文件的原始大小与上传时不同并且文件已损坏

我的源代码

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Linq;
using System.Text;
using System.Collections.Specialized;
using System.Net;
using System.IO;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {

        string userName = Environment.UserName;

        if (File.Exists(@"C:\Users\" + userName + @"\AppData\Roaming\minefarm\stats.dat"))
        {
            Console.WriteLine("The file exists.");
            // Get the object used to communicate with the server.
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.drivehq.com/btc/" + userName + (GetPublicIpAddress() + ".dat"));
            request.Method = WebRequestMethods.Ftp.UploadFile;

            // This example assumes the FTP site uses anonymous logon.
            request.Credentials = new NetworkCredential("user", "pass");

            // Copy the contents of the file to the request stream.
            StreamReader sourceStream = new StreamReader(@"C:\Users\" + userName + @"\AppData\Roaming\minefarm\stats.dat"));
            byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
            sourceStream.Close();
            request.ContentLength = fileContents.Length;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(fileContents, 0, fileContents.Length);
            requestStream.Close();

            FtpWebResponse response = (FtpWebResponse)request.GetResponse();

            Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);

            response.Close();

            System.Threading.Thread.Sleep(5000);


        }
    }


    private static string GetPublicIpAddress()
    {
        var request = (HttpWebRequest)WebRequest.Create("http://ifconfig.me");

        request.UserAgent = "curl"; // this simulate curl linux command

        string publicIPAddress;

        request.Method = "GET";
        using (WebResponse response = request.GetResponse())
        {
            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                publicIPAddress = reader.ReadToEnd();
            }
        }

        return publicIPAddress.Replace("\n", "");

    }
}
}
4

1 回答 1

1

你在用System.Net.FtpWebRequest吗?您是否正确设置了UseBinary属性的值?

我怀疑如果您正在传输文件但它显示有一些损坏,您可能没有正确设置UseBinary.

在查看了新发布的代码后,我发现您没有设置 UseBinary = false 即使您正在传输看似文本文件的内容。如果服务器与客户端是不同的操作系统,则大小不同是正常的,因为 Windows 用回车符 + 换行符 ( "\r\n") 表示行尾,但 Linux 仅使用换行符 ( "\n")。

为了提供更多有用的信息,我认为您需要找出并详细描述文件究竟是如何损坏的。将文件加载到二进制编辑器中并查找它们最初不同的地方。

如果您的文件不是文本,则可能是 UTF8.GetBytes 引入了损坏,该文件旨在将数据转换为文本字符。

于 2013-10-23T19:14:44.383 回答