如何通过FTP覆盖文件

时间:2014-04-07 07:42:02

标签: c# ftp

我的程序生成txt文件,我上传到FTP。在文件的名称中,我有一个时间跨度(没有秒)。

因此,当我在一分钟内生成两次文件时,我有相同的文件名。如果ftp上存在这样的文件,我就无法发送新文件,引发异常。

但我只需要静静地覆盖它。如何做到这一点?

目前我使用这样的功能

public bool FtpUploadFile(string filePath, FTPParameters ftpParams)
{
    // Get the object used to communicate with the server.
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpParams.Server + "/" + ftpParams.Folder + "/" + filePath);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.UsePassive = false;

    // This example assumes the FTP site uses anonymous logon.
    request.Credentials = new NetworkCredential(ftpParams.User, ftpParams.Password);

    // Copy the contents of the file to the request stream.
    StreamReader sourceStream = new StreamReader(Path.Combine(Context.Current.SystemSettings.StorePath, filePath));
    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();

    return response.ExitMessage.Trim() == string.Empty;
}

2 个答案:

答案 0 :(得分:5)

你做不到。您必须先删除现有文件。我建议您重命名服务器上已存在的文件,然后上传新文件,只有在成功的情况下才删除旧文件以确保至少有一个文件。

答案 1 :(得分:0)

我尝试了几次,它确实覆盖了目标 这是我的功能

    public bool Upload(FileInfo fi, string targetFilename)
    {
        //copy the file specified to target file: target file can be full path or just filename (uses current dir)

        //1. check target
        string target;
        if (targetFilename.Trim() == "")
        {
            //Blank target: use source filename & current dir
            target = this.CurrentDirectory + fi.Name;
        }
        else if (targetFilename.Contains("/"))
        {
            //If contains / treat as a full path
            target = AdjustDir(targetFilename);
        }
        else
        {
            //otherwise treat as filename only, use current directory
            target = CurrentDirectory + targetFilename;
        }
          string URI = Hostname + target;

        //perform copy
        System.Net.FtpWebRequest ftp = GetRequest(URI);

        //Set request to upload a file in binary
        ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
        ftp.UseBinary = true;

        //Notify FTP of the expected size
        ftp.ContentLength = fi.Length;
    //    ftp.O

        //create byte array to store: ensure at least 1 byte!
        const int BufferSize = 2048;
        byte[] content = new byte[BufferSize - 1 + 1];
        int dataRead;

        //open file for reading
        using (FileStream fs = fi.OpenRead())
        {
            try
            {
                //open request to send
                using (Stream rs = ftp.GetRequestStream())
                {
                    do
                    {
                        dataRead = fs.Read(content, 0, BufferSize);
                        rs.Write(content, 0, dataRead);
                    } while (!(dataRead < BufferSize));
                    rs.Close();
                }

            }
            catch (Exception)
            {

            }
            finally
            {
                //ensure file closed
                fs.Close();
            }

        }


        ftp = null;
        return true;

    }
相关问题