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 を設定していないことがわかりました。サーバーがクライアントとは異なる OS の場合、Windows はキャリッジ リターン + ライン フィード ( ) で行末を表すの"\r\n"に対し、Linux はライン フィード ( ) のみを使用するため、サイズが異なるのは正常です"\n"

より有用な情報を提供するには、ファイルがどのように破損しているかを正確に調べて説明する必要があると思います。ファイルをバイナリ エディタにロードし、最初に異なる場所を探します。

ファイルがテキストでない場合、データをテキスト文字に変換することを目的とした UTF8.GetBytes によって破損が発生した可能性があります。

于 2013-10-23T19:14:44.383 に答える