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

How to handle partial file so that it will not be pickup by SFTP schedule pick up script?

我有一个要求

when uploading the files to the pick-up folder, files will be uploaded with a .tmp (or)._ (or) .filepart extensions and after successful upload files will be renamed to the original file name.

这是为了避免通过 SFTP 文件夹端的设置部分提取 .xml 文件。

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

关于如何在 MVC、C# 中实现这一点的任何想法。

我更喜欢完全在单独的文件夹中执行此操作。然后移动到拾取文件夹。

那么就不需要重命名了。

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

在尝试发送之前检查文件是否被锁定,也可能有效,或者结合使用。

我说的是先生成一个本地文件,一旦完全写入,只需使用 File.Move() 方法,这样您就可以将新生成的文件从其 "safe" 文件夹中移出,进入 pickup 文件夹,SFTP 不断地在其中寻找文件。

如果它正在拾取您正在接收的文件,那么这只是在尝试对其进行任何操作之前的检查。

首先,一旦您收到来自 post 的文件流,上传 "already" 成功(很有可能)。因此,当您从 post 中获得数据时,您应该已经可以编写它了。我在这里可以远程看到的唯一一点是,远程进程要么不断检查 .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();
        }