如何检查文件是否已打开/写入C#
我有下面的代码,它用定时器为我移动文件(每10分钟移动200个文件或我在设置窗体上保存的内容) 问题是当文件被打开和写入时会被移动,我知道我必须在我的程序中“打开”它并检查是否存在异常,但我不知道应该在代码中的什么位置放置它如何检查文件是否已打开/写入C#,c#,C#,我有下面的代码,它用定时器为我移动文件(每10分钟移动200个文件或我在设置窗体上保存的内容) 问题是当文件被打开和写入时会被移动,我知道我必须在我的程序中“打开”它并检查是否存在异常,但我不知道应该在代码中的什么位置放置它 try { string origDir = @"" + Properties.Settings.Default.MoveFrom; string destDir = @"" + Properties.Settings.Def
try
{
string origDir = @"" + Properties.Settings.Default.MoveFrom;
string destDir = @"" + Properties.Settings.Default.MoveTo;
string oldDir = @"" + Properties.Settings.Default.MoveToOld;
int filesPerMove = Properties.Settings.Default.FilesPerMove;
int i = 0;
DateTime dateMove= DateTime.Now;
DirectoryInfo dirInfo = new DirectoryInfo(origDir);
FileInfo[] files = dirInfo.GetFiles("*.txt");
foreach (string file in Directory.GetFiles(origDir))
if (new FileInfo(file).Length > 0)
{
if (i < filesPerMove)
{
ListViewItem lviSuccess = new ListViewItem(origFile.Name);
lviSuccess.SubItems.Add(origFile.LastWriteTime.ToString());
lviSuccess.SubItems.Add(dateMove.ToString());
lviSuccess.SubItems.Add(origFile.Length.ToString());
lviSuccess.SubItems.Add(origDir.ToString());
lviSuccess.SubItems.Add(destDir.ToString());
lvFileMoves.Items.Add(lviSuccess);
lviSuccess.UseItemStyleForSubItems = true;
lviSuccess.ForeColor = Color.Green;
FileInfo destFile = new FileInfo(file.Replace(origDir, destDir));
FileInfo destFile1 = new FileInfo(file.Replace(origDir, oldDir));
System.IO.File.Copy(origFile.FullName, destFile1.FullName, true);
System.IO.File.Copy(origFile.FullName, destFile.FullName, true);
File.Delete(origFile.FullName);
i++;
}
}
}
catch (System.IO.IOException ex)
{
ListViewItem lvi = new ListViewItem(ex.Message);
lvFileMoves.Items.Add(lvi);
lvi.UseItemStyleForSubItems = true;
lvi.ForeColor = Color.Red;
}
试试看
{
字符串origDir=@“+Properties.Settings.Default.MoveFrom;
字符串destDir=@“+Properties.Settings.Default.MoveTo;
字符串oldDir=@“+Properties.Settings.Default.MoveToOld;
int filesPerMove=Properties.Settings.Default.filesPerMove;
int i=0;
DateTime dateMove=DateTime.Now;
DirectoryInfo dirInfo=新的DirectoryInfo(origDir);
FileInfo[]files=dirInfo.GetFiles(“*.txt”);
foreach(Directory.GetFiles(origDir)中的字符串文件)
如果(新文件信息(file).Length>0)
{
如果(i
您应该将异常处理放在靠近文件处理的位置:
try
{
FileInfo destFile = new FileInfo(file.Replace(origDir, destDir));
FileInfo destFile1 = new FileInfo(file.Replace(origDir, oldDir));
System.IO.File.Copy(origFile.FullName, destFile1.FullName, true);
System.IO.File.Copy(origFile.FullName, destFile.FullName, true);
File.Delete(origFile.FullName);
i++;
}
catch(System.IO.IOException ex)
{
ListViewItem lvi = new ListViewItem(ex.Message);
lvFileMoves.Items.Add(lvi);
lvi.UseItemStyleForSubItems = true;
lvi.ForeColor = Color.Red;
}
通过这种方式,当一个文件失败时,您可以继续使用以下文件。轮询是有害的
您真正想要的是在发生更改时得到通知
这是一种方法
<>这是一个显示如何使用它的好链接(从C++,翻译成C /互操作应该是直截了当的):
FileStream outStream = null;
try
{
outStream = File.OpenWrite(origFile.ToString());
FileInfo destFile = new FileInfo(file.Replace(origDir, destDir));
FileInfo destFile1 = new FileInfo(file.Replace(origDir, oldDir));
System.IO.File.Copy(origFile.FullName, destFile1.FullName, true);
System.IO.File.Copy(origFile.FullName, destFile.FullName, true);
File.Delete(origFile.FullName);
lblSenast.Text = string.Format("Senaste flytt gjordes {0}", dateMove.ToString());
}
catch (IOException exx)
{
ListViewItem lvi = new ListViewItem(exx.Message);
lvFileMoves.Items.Add(lvi);
lvi.UseItemStyleForSubItems = true;
lvi.ForeColor = Color.Gray;
}
finally
{
outStream.Close();
outStream.Dispose();
}
进程无法访问文件“Bla-Bla-Bla”,因为它正被另一个进程使用您可以在FileInfo数组之后使用try catch block。您好,您能举个例子吗?问题仍然是,我的程序移动我在记事本中打开的文件时,记事本不会锁定该文件。无法检查文件是否由记事本(或记事本2)打开。但是,如果它是由MS Word或OpenOffice Writer打开的,则该文件将被锁定,您可以对其进行检查。有关详细信息,请参阅