Содержит функцию не находит определенные файлы в подкаталогах - PullRequest
1 голос
/ 03 июля 2019

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

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

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

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

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

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

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

0 голосов
/ 03 июля 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: этот код вносит много изменений в ваш код, но по сути они одинаковы.

...