我有一个应用程序正在查看旧数据的一些文件。为了确保我们不破坏好项目,我将文件复制到临时位置。我正在检查的一些目录是源代码目录,它们有.svn文件夹。我们使用Subversion来管理我们的代码。
一旦我搜索了所有文件,我想删除临时缓存。听起来很简单吧?
由于某种原因,我的所有.svn目录都不会从缓存中删除。他们使应用程序崩溃。
由于原因(进入这里太深了),我必须使用临时文件夹,因此出于政治原因“扫描原始文件”是不可能的。
我可以进入资源管理器并删除它们。没问题。没有警告。只是删除。但代码崩溃,“访问{file}被拒绝”。我对这个问题感到满意,所以任何帮助都会受到赞赏。
虽然我为了你的理智而将函数简化为LITTLE,但代码真的很简单。
List<string> tmpCacheManifest = new List<string>();
string oldRootPath = "C:\\some\\known\\directory\\";
string tempPath = "C:\\temp\\cache\\";
foreach (string file in ListOfFilesToScan)
{
string newFile = file.Replace(oldRootPath, tempPath);
// This works just fine.
File.Copy(file, newFile);
tmpCacheManifest.add(newFile);
}
// ... do some stuff to the cache to verify what I need.
// Okay.. I'm done.. Delete the cache.
foreach (string file in tmpCacheManifest)
{
// CRASH!
File.Delete(file);
}
List<string> tmpCacheManifest = new List<string>();
string oldRootPath = "C:\\some\\known\\directory\\";
string tempPath = "C:\\temp\\cache\\";
foreach (string file in ListOfFilesToScan)
{
string newFile = file.Replace(oldRootPath, tempPath);
// This works just fine.
File.Copy(file, newFile);
tmpCacheManifest.add(newFile);
}
// ... do some stuff to the cache to verify what I need.
// Okay.. I'm done.. Delete the cache.
foreach (string file in tmpCacheManifest)
{
// CRASH!
File.Delete(file);
}
*更新* :异常是UnauthorizedAccessException。文本是“访问路径'C:\ temp \ cache \ some-sub-dirs \ .svn \ entries'被拒绝。”
它发生在XP,XP-Pro和Windows 7下。
*更新2 * 我的验证甚至没有ATTEMPTS来查看subversion文件。但是,我确实需要它们。这是政治废话的一部分。我必须证明每个文件都被复制了...它是否被扫描过。
我意识到File.Delete的常见嫌疑。我意识到UnauthorizedAccessException意味着什么。我没有访问权限。这是一个明智的选择。但我只是复制了文件。我怎样 NOT 可以访问该文件?
*更新3 * 答案是在“只读”标志中。这是我用来解决它的代码:
foreach (string file in ListOfFilesToScan)
{
string newFile = file.Replace(oldRootPath, tempPath);
// This works just fine.
File.Copy(file, newFile);
//// NEW CODE ////
// Clear any "Read-Only" flags
FileInfo fi3 = new FileInfo(fn);
if ((fi3.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{
fi3.Attributes = (FileAttributes)(Convert.ToInt32(fi3.Attributes) - Convert.ToInt32(FileAttributes.ReadOnly));
}
tmpCacheManifest.add(newFile);
}
// ... do some stuff to the cache to verify what I need.
答案 0 :(得分:12)
据我所知,Subversion将其.svn子目录中的文件标记为只读。
尝试在删除文件之前重置只读属性。我真的不知道任何C#,但谷歌快速建议这可能会解决问题:
File.SetAttributes(file, FileAttributes.Normal);
答案 1 :(得分:2)
我看到的唯一问题就是这部分:
// ... do some stuff to the cache to verify what I need.
如果您打开文件并忘记关闭它,您仍然可以独占访问它,因此以后无法删除它。
答案 2 :(得分:2)
听起来你无权删除文件...
以上链接表示您在以下时间获得UnauthorizedAccessException
:
来电者没有所需的权限。
- 或 -
path是一个目录。
- 或 -
path指定了只读文件。
这是其中之一。
答案 3 :(得分:1)
听起来像权限问题。虽然如果File.Copy已经有效,你很明显有写访问权,但很棘手......
我唯一能想到的是文件仍然在某个地方打开了句柄(正如其他人在你的做一些东西到缓存部分中所建议的那样)。
答案 4 :(得分:0)
首先:“崩溃”意味着例外,对吧?哪一个?你能抓住并展示它吗?
第二件事:你是在复制subversion存储库,虽然你不关心subversion元数据?这就是svn export的意义(目标中没有.svn目录)。
第一个问题的答案是你真正需要提供的。也许某事抓住了.svn并锁定了一些文件。 TortoiseSVN也许(给你很好的叠加图标......)?
答案 5 :(得分:0)
如果文件夹包含只读文件,则Directory.Delete不会删除它并引发您获得的异常。对于此页面的未来访问者,我找到了一个简单的解决方案,它不要求我们递归所有文件并更改其只读属性:
Process.Start("cmd.exe", "/c " + @"rmdir /s/q C:\Test\TestDirectoryContainingReadOnlyFiles");
(稍微更改一下,不要暂时触发cmd窗口,这可以在互联网上找到)
答案 6 :(得分:-2)
不明白你想做什么,但是把它修改为777或775怎么样。: - /
编辑:
在窗户上注意到你。您必须更改权限。不知道windows是怎么做到的: - /