如何处理部分文件,使其不会被SFTP计划提取脚本提取?

时间:2018-07-25 12:42:38

标签: c# asp.net-mvc sftp

我有一个要求

  

将文件上传到分拣文件夹时,文件将被上传   具有.tmp(或)._(或).filepart扩展名并且成功后   上传文件将重命名为原始文件名。

这是必需的,以避免通过SFTP文件夹侧的设置部分提取.xml文件。

例如使用.xml.tmp上传,成功上传后,将文件重命名为.xml

关于如何在MVC,C#中实现此目标的任何想法。

2 个答案:

答案 0 :(得分:1)

我希望完全在单独的文件夹中执行此操作。然后移至拾取文件夹。

然后不需要重命名。

private bool IsFileLocked()
        {
    try
                {
                    FileStream fs = File.OpenWrite(FilePath);
                    fs.Close();
                    return false;
                }
                catch (Exception)
                {
                    Console.WriteLine("File locked: " + FileName);
                    return true;
                }
}

要在尝试发送之前检查文件是否已锁定,也可能会起作用或结合使用。

我说的是先生成一个本地文件,一旦完成完全写入,只需使用File.Move()方法,然后将新生成的文件从其“安全”文件夹移至拾取文件夹, SFTP一直在寻找文件。

如果它正在捡起您要接收的文件,那么这只是尝试对其进行任何处理之前的检查。

答案 1 :(得分:0)

首先,一旦您从帖子中接收到文件流,就表示上传已经“成功”(很有可能)。因此,当您从帖子中获取数据时,您应该已经可以很好地编写它了。我在这里可以远程看到的唯一一点是,远程进程要么不断检查.xml文件,所以让我们说一下.xml文件是否很大,并假设(事实并非如此)您需要花一些时间来编写流到远程目标,他们不想只检查xml的一部分,他们需要全部。如果是这样,应该执行以下操作(根据您的需要进行修改);

[HttpPost]
        public ActionResult Upload()
        {
            if (Request.Files.Count < 1)
            {
                ViewBag.Result = "No files were provided";
                return PartialView("Error");
            }

            foreach (string F in Request.Files)
            {
                var FInfo = Request.Files[F];
                var TemporaryFileName = $"{FInfo.FileName}.tmp";

                try
                {

                    using (var FStream = new FileStream(TemporaryFileName, FileMode.Create, FileAccess.Write))
                    {
                        FInfo.InputStream.CopyTo(FStream);
                    }

                }
                catch (Exception e)
                {
                    ViewBag.Result = e.Message;
                    return PartialView("Error");
                }
                finally
                {
                    System.IO.File.Move(TemporaryFileName, $"{FInfo.FileName}");
                }

            }

            ViewBag.Result = "Files have been uploaded";

            return View();
        }