繁体   English   中英

即使文件不存在,File.exists也会显示该文件

[英]File.exists shows file even when it does not exist

我正在检查文件是否存在,如果存在,我将其放入列表中,否则我将从列表中删除。 我的代码是这样的:

foreach (KeyValuePair<string, string> kvp in dict)
{
    _savedxml.Add(kvp.Key.ToString());
}

string namewithext=null;
for (int i = 0; i < _savedxml.Count; i++)
{
    namewithext = string.Concat(_savedxml[i], ".xml");
    System.IO.FileInfo file_info = new System.IO.FileInfo((string)namewithext);
    long size = file_info.Length;
    if (size == 0)
    {
        _savedxml.RemoveAt(i);
    }
}

for (int i = 0; i < _savedxml.Count; i++)
{
    if (System.IO.File.Exists(System.IO.Path.GetFullPath(namewithext)))
    {
    }
    else
    {
        _savedxml.Remove(namewithext);
    }
}

我尝试了很多方法,但即使文件不存在,列表也包含它。 我可能犯了一个愚蠢的错误。

我怎样才能做到这一点?

代码中有几个错误:

  • 您为第一个循环中的每个项设置namewithext变量,然后在第二个循环中使用它,因此您将检查最后一个文件是否反复存在。

  • 删除项目时,下一个项目将在列表中占据一席之地,因此您将跳过检查下一个项目。

  • 在检查文件是否存在之前,您正在检查文件的长度,因此当您尝试获取不存在的文件的长度时,将获得FileNotFoundException

更正(和一些清理):

foreach (KeyValuePair<string, string> kvp in dict) {
  _savedxml.Add(kvp.Key);
}

for (int i = _savedxml.Count - 1; i >= 0 ; i--) {
  string namewithext = _savedxml[i] + ".xml";
  if (!System.IO.File.Exists(System.IO.Path.GetFullPath(namewithext))) {
    _savedxml.RemoveAt(i);
  }
}

for (int i = _savedxml.Count - 1; i >= 0 ; i--) {
  string namewithext = _savedxml[i] + ".xml";
  System.IO.FileInfo file_info = new System.IO.FileInfo(namewithext);
  if (file_info.Length == 0) {
    _savedxml.RemoveAt(i);
  }
}

您可以发现代码存在两个问题:

  1. 获取引用不存在的文件的FileInfo实例的Length属性应该抛出异常,而不是返回0。

  2. 在第二个for循环中,你遍历你的savedxml列表,但你永远不会改变“namewithext”变量,这会导致你每次尝试删除相同的条目。

编辑此外,Duncan是正确的,当然,如果“if(size == 0)”分支中的代码运行,您将跳过列表中的条目。

您将按索引从集合中删除项目,然后将更改集合中其余项目的位置。 然后它将跳过它本应删除的条目。

_savedxml文件名没有extesnion,所以在_savedxml.Remove(namewithext);之前_savedxml.Remove(namewithext); namewithext删除namewithext

foreach (KeyValuePair<string, string> kvp in dict)
{
    _savedxml.Add(kvp.Key.ToString());
}

string namewithext = null;

int i = 0;

while (i < _savedxml.Count)
{
    namewithext = string.Concat(_savedxml[i], ".xml");
    System.IO.FileInfo file_info = new System.IO.FileInfo((string)namewithext);
    if (!file_info.Exists || file_info.Length == 0)
        _savedxml.RemoveAt(i);
    else
        i++;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM