2011-11-09 20 views
1

ファイルが存在するかどうかを確認している場合はリストに入れ、それ以外の場合はリストから削除します。私のコードはそうである:ファイルが存在しない場合でもFile.existsが表示されます

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

私は多くの方法を試しましたが、ファイルが存在しないにもかかわらず、リストにはそれが含まれています。私はおそらくばかげたエラーを作りました。

どうすればいいですか?

+0

'System.IO.Path.GetFullPath(namewithext)'の戻り値は何ですか?このファイルはどこにありますか(ネットワーク共有...)? – Yahia

答えて

3

コード内のいくつかのエラーがあります:

  • あなたが最初のループで各項目の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); 
    } 
} 
+0

私はループの途中でRemoveAt(i)を使用することは悪い習慣であると考えています。私は新しい空のリストを使用して有効な名前を付け加えます。(しかし、まだ投票します( - :) –

+0

@RoeeGavirel:そうです、それは一つの方法です。リスト .RemoveAllを使うことは別です。 :)元のコードをあまりにも変更したくないのです:) – Guffa

+0

素晴らしい!ありがとう! :) – user877852

0

コレクションからインデックスでアイテムを削除すると、コレクション内の残りのアイテムの位置が変更されます。その後、削除する必要のあるエントリをスキップします。

1

は2つの、私は見つけることができますあなたのコードに問題があります。例外をスローする必要があり、存在しないファイルを参照するのFileInfoインスタンスのLengthプロパティを取得

  1. 、0を返しません。

  2. 2回目のforループでは、savedxmlリストを繰り返し処理しますが、「namewithext」変数を変更することはありません。毎回同じエントリを削除してください。

EDIT また、ダンカンは、当然のことながら、右であるかの内部コード「(サイズ== 0)があれば、」枝がこれまでに実行します、あなたはあなたのリストにエントリをスキップすると思います。

0

_savedxmlのファイル名にはextesnionが含まれていないため、_savedxml.Remove(namewithext);の前にext39nを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++; 
} 
関連する問題