我正在用C#编写一个需要重复访问1个图像文件的程序.大部分时间它都可以工作,但如果我的计算机运行速度很快,它会在将文件保存回文件系统之前尝试访问该文件并抛出错误:"另一个进程正在使用的文件".
我想找到解决这个问题的方法,但是我所有的谷歌搜索都只是通过使用异常处理来创建检查.这违背了我的宗教信仰,所以我想知道是否有人有更好的方法呢?
很多时候,我们在尝试在Windows平台上编写文件时遇到错误,
"该进程无法访问文件'XXX',因为它正由另一个进程使用."
如何在写入文件之前检入C#,其他进程没有使用它?
这就是我现在这样做的方式.我尝试在FileShare设置为none的情况下打开该文件.所以我想要独占访问该文件.如果我不能得到那么它是一个很好的赌注别人有文件被锁定.
必须有一个更好,更快的方式.有任何想法吗?
try
{
using (FileStream fs = File.Open(GetLockFilename(), FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
fs.Close();
}
// The file is not locked
}
catch (Exception)
{
// The file is locked
}
Run Code Online (Sandbox Code Playgroud) 这里是我得到了一个被称为gridview1 datagridviewer,当我把它上传更新的文件名和路径,并存储在文件夹"弹匣"上述文件数据库中的gridview1和表格文件的fileupload1交易......但现在我什么想要做的是反过来我得到了如何使用gridview删除表条目但删除文件夹"Mag"无法正常使用C#中的以下代码或代码隐藏
protected void GridView1_Del(object sender, EventArgs e)
{
string DeleteThis = GridView1.SelectedRow.Cells[0].Text;
string[] Files = Directory.GetFiles(@"i:/Website/WebSite3/Mag/");
foreach (string file in Files)
{
if (file.ToUpper().Contains(DeleteThis.ToUpper()))
{
File.Delete(file);
}
}
}
Run Code Online (Sandbox Code Playgroud)
它给了我错误
"你调用的对象是空的."
请告诉我,我做错了什么是新的,不必深入了解平台所以任何和所有的帮助将不胜感激提前感谢马克
这是我找到的答案感谢Tammy和其他所有人的答案
好的,交易目标函数从gridview和数据库表中删除文件详细信息,并从存储文件的项目文件夹中删除文件
在gridview的脚本部分,你想要包括
OnRowDeleting="FuntionName"
Run Code Online (Sandbox Code Playgroud)
不
OnSelectedIndexChanged = "FuntionName"
Run Code Online (Sandbox Code Playgroud)
要么
OnRowDeleted="FuntionName"
Run Code Online (Sandbox Code Playgroud)
然后在C#代码(代码隐藏)
protected void FuntionName(object sender, GridViewDeleteEventArgs e)
{
// storing value from cell
TableCell cell = GridView1.Rows[e.RowIndex].Cells[0];
// full path required
string fileName = ("i:/Website/WebSite3/Mag/" + cell.Text);
if(fileName != null || fileName != string.Empty)
{
if((System.IO.File.Exists(fileName)))
{ …Run Code Online (Sandbox Code Playgroud) 我试图使用StreamReader读取文件,但它总是被另一个进程使用,所以我收到此错误:
该进程无法访问文件'\ arfjwknasgmed17\C $\FLAG CONDITION\CP-ARFJN-FLAG.XLS',因为它正由另一个进程使用.
有没有办法可以在不复制的情况下阅读本文?或者这是我唯一的选择?
我想在开始替换文件之前检查文件列表是否正在使用或不可写.当然我知道从文件检查和文件复制的时间有可能一个或多个文件将由其他人锁定,但我处理这些异常.我想在文件复制之前运行此测试,因为完整的文件列表比不能替换操作中间的文件更有可能成功.
你们中的任何人都是正确方向的例子或暗示
在.Net中是否有办法确切地找出哪个进程锁定了文件?
编辑:我这样做是因为我想让我的用户知道他们无法修改/打开文件,因为目前,他们正在使用的另一个程序(如Excel)打开它.希望,这有帮助.
可能重复:
如何找出使用.NET锁定文件的进程?
我想复制一个文件,但它被另一个应用程序锁定,因此抛出了FileInUseException.我想告诉用户哪个应用程序正在锁定我正在尝试复制的文件..NET Framework中有没有办法做到这一点?如果没有这方面的知识,我会告诉用户使用Unlocker应用程序.
我正忙于为使用 Ionic Zip 库来管理数据的现有 C# (4.0) 应用程序开发附加模块。在我的模块中,我需要从 zip 文件加载数据,操作它们,然后再次写回。我的例程在单元测试中运行正常,但是当从主机应用程序中调用时,它会引发异常读取“该进程无法访问该文件,因为它正在被另一个进程使用”。当我尝试调用Save()Zip 存档的函数时,就会发生这种情况。
我检查了哪个进程实际锁定了文件,它恰好是应用程序本身。因此,我得出结论,主机程序可能存在某种干扰:例如,文件流在某个地方打开但未关闭。(顺便说一句,有没有一些聪明的技巧来照顾这些地方?)
令我困惑的是,在处理文件时,Ionic 的 ZipFile 是否真的锁定/解锁文件,如以下代码段所示:
ZipFile zf = new ZipFile("test01.zip");
zf.Save();
// FileSystemTools.WhoIsLocking is a utility showing a list pf processes
// holding access to a given file
// Similar to http://stackoverflow.com/questions/1304/how-to-check-for-file-lock/20623302#20623302
List<Process> processes = FileSystemTools.WhoIsLocking("test01.zip");
Assert.That(processes.Count == 1);
zf.Dispose();
processes = FileSystemTools.WhoIsLocking("test01.zip");
Assert.That(processes.Count == 0);
Run Code Online (Sandbox Code Playgroud)
在Save()锁定进程数为 1(正在运行的进程本身)之后,但在Dispose()没有之后,这证明 Ionic.ZipFile 显然在内部持有一些文件流并以某种方式管理它们。然而,在其他地方,则Dispose()没有效果:锁定进程的数量不会递减。Iconic.Zip 文档很少而且没有说服力。
c# ×9
.net ×5
file ×3
file-io ×3
file-locking ×3
windows ×2
asp.net ×1
filesystems ×1
process ×1