File.exists показывает файл, даже если он не существует - PullRequest
1 голос
/ 09 ноября 2011

Я проверяю, существует ли файл, и если он существует, я помещаю его в список, в противном случае я удаляю из списка. Мой код таков:

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);
    }
}

Я пробовал много способов, но хотя файл не существует, список содержит его. Я, вероятно, сделал глупую ошибку.

Как я могу это сделать?

Ответы [ 4 ]

3 голосов
/ 09 ноября 2011

В коде есть несколько ошибок:

  • Вы устанавливаете переменную 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 голос
/ 09 ноября 2011

Есть две проблемы с вашим кодом, которые я могу обнаружить:

  1. Получение свойства Length экземпляра FileInfo, который ссылается на несуществующий файл, должно вызвать исключение, а не возвращать 0.

  2. Во втором цикле for вы перебираете свой список savexml, но никогда не меняете переменную «namewithext», что заставляет вас пытаться удалять одну и ту же запись каждый раз.

EDIT Кроме того, Дункан прав, конечно, если код внутри ветки «if (size == 0)» будет когда-либо выполняться, вы пропустите запись в своем списке.

0 голосов
/ 09 ноября 2011

_savedxml имеет имена файлов без extesnion, поэтому перед _savedxml.Remove(namewithext); удалите extesnion из 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++;
}
0 голосов
/ 09 ноября 2011

Вы удаляете элемент из вашей коллекции по индексу, который затем изменит положение остальных элементов в вашей коллекции. Затем он пропустит запись, которую должен был удалить.

...