Функция «Содержит» не находит определенные файлы в подкаталогах

Я создал массив строк, который использует функцию Directory.GetFiles, которая заполняет массив расширениями файлов .cs из всех подкаталогов моего проекта. Это нормально, однако я пытался записать эти файлы в текстовый документ, исключив определенные файлы из массива, такие как «AssemblyInfo.cs» и «TemporaryGeneratedFiles_xxx.cs», используя метод contains для фильтрации файлов с этими именами. По большей части подавляющее большинство этих файлов не были записаны в текстовый документ, однако в некоторых случаях эти файлы удается обнаружить в текстовом документе.

Я пробовал использовать оператор foreach вместо цикла for. Я пробовал играть с str.flush(), str.close(), directoryNames.Dispose() и directoryNames.Close(), помещая их в разные места цикла for. Я попытался вложить операторы if вместо использования оператора &&. Оператор || в этой ситуации не работает. Я пробовал использовать полное имя файла и только его фрагменты, и ничего из этого не работает. В какой-то момент мне удалось удалить все файлы, в которых было «Временное», но файлы «AssemblyInfo.cs» все еще остаются. Я даже сделал метод, чтобы полностью удалить все, что содержит слово «временный» или «сборка» в имени файла, но это также не помогло.

FileStream directoryNames = new FileStream(dirListPath, FileMode.OpenOrCreate);
StreamWriter str = new StreamWriter(directoryNames);

string[] allFiles = Directory.GetFiles(dirPath, "*.cs", SearchOption.AllDirectories);

for (int i = 0; i < allFiles.Length; i++)
{
    if ((!allFiles[i].Contains("Temporary")) && (!allFiles[i].Contains("Assembly")))
    {
        str.Write(allFiles[i] + Environment.NewLine);
    }
}
str.Flush();
str.Close();
directoryNames.Dispose();
directoryNames.Close();

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


person Thomas.W.Waller    schedule 03.07.2019    source источник
comment
Можете ли вы показать нам пример вывода и желаемый результат вашего кода?   -  person theblackips    schedule 03.07.2019
comment
string.Contains чувствителен к регистру. Вот как сделать поиск без учета регистра > или еще лучше, используя метод расширения здесь "> stackoverflow.com/questions/17563929/   -  person Steve    schedule 03.07.2019
comment
Пожалуйста, поставьте точку останова на str.Write(allFiles[i] + Environment.NewLine);. Просматривайте его до тех пор, пока значение allFiles[i] не станет файлом, который вы не хотите добавлять в файл (да, это может занять некоторое время и будет утомительным и скучным). Каково точное значение allFiles[i], когда это происходит?   -  person mjwills    schedule 03.07.2019
comment
however, there are a few cases where these files manage to show up within the text document. Не могли бы вы поделиться с нами этими несколькими случаями?   -  person mjwills    schedule 03.07.2019
comment
Рассматривали ли вы возможность удаления dirListPath перед запуском кода? У меня есть подозрение, что использование OpenOrCreate означает, что вы пишете в начало файла, но что старое содержимое файла может остаться там, так что, возможно, вы видите старый текст в файле? Один из способов проверить мою теорию — записать THIS IS TO THE END в поток вне цикла, а затем посмотреть, где это заканчивается в файле._   -  person mjwills    schedule 03.07.2019


Ответы (2)


Спасибо всем, кто опубликовал. После некоторого тестирования mjwillis оказался прав. Вместо того, чтобы перезаписывать содержимое текстового файла, он продолжал записывать в начало файла и добавлять содержимое, которое было записано ранее. Исправил, добавив

using (FileStream clearTextDocument = File.Create(dirListPath)) { }

Перед строкой FileStream DirectoryNames. Не стесняйтесь публиковать другой способ очистки текстового документа, если он более привлекателен, чем этот.

person Thomas.W.Waller    schedule 03.07.2019

Как предложил @steve, ваш код игнорирует чувствительность к регистру. Попробуй это.

var allFiles = Directory.EnumerateFiles(dirPath, "*.cs", SearchOption.AllDirectories)
                        .Where(file => file.IndexOf("Temporary", StringComparison.InvariantCultureIgnoreCase) < 0
                                       && file.IndexOf("Assembly", StringComparison.InvariantCultureIgnoreCase) < 0);

File.WriteAllLines(dirListPath, allFiles);

PS: Этот код вносит много изменений в ваш код, но по сути они одинаковы.

person Erdogan Kurtur    schedule 03.07.2019