如果在创建文件时出现问题,我一直在写一个临时文件,然后移动到目的地.就像是:
var destination = @"C:\foo\bar.txt";
var tempFile = Path.GetTempFileName();
using (var stream = File.OpenWrite(tempFile))
{
// write to file here here
}
string backupFile = null;
try
{
var dir = Path.GetDirectoryName(destination);
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
Util.SetPermissions(dir);
}
if (File.Exists(destination))
{
backupFile = Path.Combine(Path.GetTempPath(), new Guid().ToString());
File.Move(destination, backupFile);
}
File.Move(tempFile, destination);
if (backupFile != null)
{
File.Delete(backupFile);
}
}
catch(IOException)
{
if(backupFile != null && !File.Exists(destination) && File.Exists(backupFile))
{
File.Move(backupFile, destination);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是在这种情况下新的"bar.txt"不会从"C:\ foo"目录继承权限.然而,如果我直接在"C:\ foo"中通过explorer/notepad等创建文件,则没有问题,所以我相信权限在"C:\ foo"上正确设置.
找到移动文件夹时 …
现在我正在处理一个小应用程序,它在iss服务器上更新mssql的紧凑数据库文件.
我更喜欢使用SSIS来组织流程.几天它运作良好,但后来开始出错.
在SSIS中,我使用"文件系统任务"的"移动文件"操作将生成的文件从文件夹移动到iss服务器的共享文件夹.如果失败,如果文件被锁定,则稍后再尝试.但我看到有时目标文件夹中的文件开始消失.
然后我决定编写自定义代码.我删除了"文件系统任务"并放置了"脚本任务"而不是它.并在其中写几行.
string destinationFile, sourceFile;
destinationFile = Path.Combine(Dts.Variables["FileRemoteCopyLocation"].Value.ToString(), Dts.Variables["CreatedFileName"].Value.ToString());
sourceFile = Path.Combine(Dts.Variables["OrginalFilePath"].Value.ToString(), Dts.Variables["CreatedFileName"].Value.ToString());
bool written = false;
try
{
File.Copy(sourceFile, destinationFile, true);
File.Delete(sourceFile);
written = true;
}
catch(IOException) {
//log it
}
if (written)
Dts.TaskResult = (int)ScriptResults.Success;
else
Dts.TaskResult = (int)ScriptResults.Failure;
Run Code Online (Sandbox Code Playgroud)
它运作良好.但是我通过锁定目标文件来尝试它.我在Sql Server Management Studio中连接了目标文件(它是一个sdf文件).而且令人惊讶的是它也有效.
我已经从操作系统尝试了它,通过复制源文件并将其粘贴到目标.Windows 7问我是否要覆盖它,我说是的,它覆盖了我用于另一个进程的文件(复制和替换),没有警告没有错误.但如果尝试重命名或删除它不会让我这样做.或者,如果我尝试剪切并粘贴它(移动和替换),则表示"您需要获得执行此操作的权限".
据我所知,"复制,删除"和"移动"是完全不同的事情.我仍然无法理解如何覆盖锁定的文件.
有任何想法吗?