我们有一个在客户端上运行的C#WinForms应用程序。该应用程序从FTP下载文件,然后将其保存在共享驱动器上(托管在服务器上),然后服务器将运行一些代码来解密该文件,并将解密后的文件发回到共享驱动器的相同位置。加密文件,使用其他文件名。完成此操作后,执行将传递回客户端,并尝试检查解密的文件是否存在。然后由于找不到该文件而引发异常。
客户代码:
protected void DecryptFile(string aEncryptedFilePath, string aDecryptedFilePath)
{
AppController.Task.SystemTaskManager.ExecuteTask(new TaskRequest(TaskPgpFileDecrypt.TaskId, aEncryptedFilePath, aDecryptedFilePath));
if (!File.Exists(aDecryptedFilePath)
throw new FileNotFoundException("File does not exist"); // Exception thrown here
}
服务器代码:
public TaskResponse Execute(string aSourceFilePath, string aDestinationFilePath)
{
// Decryption Code
if (!File.Exists(DestinationFilePath))
throw new ApplicationException($"Could not {ActionDescription} file {SourceFilePath}. Expected output file {DestinationFilePath} is missing.");
using (var fileStream = new FileStream(DestinationFilePath, FileMode.Open))
fileStream.Flush(true);
return new TaskResponse();
}
我已经尽力简化了,但是您可以看到客户端传入了aEncryptedFilePath
,并且期望它是aDecrypedFilePath
,服务器代码将解密加密的文件,并且存储在aDestinationFilePath
中存储的路径上。
现在在服务器代码中,您还可以看到我们检查文件是否存在,如果不存在,服务器将引发异常。但是,这是踢脚线。服务器的文件存在,检查返回true,然后继续执行。只有当我们到达客户端代码时,File.Exist
检查才会失败!我们尝试刷新缓冲区以确保将文件写入磁盘,但这完全没有帮助。
另一有用的信息是,我可以验证文件是否存在,因为如果我看着创建文件的文件夹,就可以看到它已经创建。但是,如果我在文件显示后立即单击它,则会从Windows收到此警告:
如果我关闭警告并等待一两秒钟,则可以打开文件。
什么可能导致这种行为?
答案 0 :(得分:0)
Task类是异步操作。根据此处的代码,您将触发解密命令,然后在发出命令对其进行解密后立即检查文件是否存在。因为这将需要一些服务器周期才能完成,所以您将需要等待任务完成才能访问文件。
有一个非常好的MSDN文档,显示了如何在继续执行代码之前等待任务完成:https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task?view=netframework-4.8#WaitingForOne