如何处理部分文件,使其不会被 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();
}
我有一个要求
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();
}