2012-06-15 5 views
0

Сегодня я столкнулся с очень странной ошибкой C#.Strange C# Directory.GetFiles error

Я написал небольшой метод, который должен искать и обрабатывать весь Xnb-файл XNA в любой заданной директории. На большинстве компьютеров он работал отлично - ожидайте некоторых случаев (два парня с проблемой XP сообщили).

я только был в состоянии воспроизвести эту ошибку на win7 один раз (и, конечно, за пределами VC#)

Вот метод:

files = Directory.GetFiles("Content\\Textures\\Houses\\Roof"); 

for (int i = 0; i < files.Length; i++) 
{ 
    string path = files[i].Substring(BasicUtils.FindsubString(files[i], "Textures")).Replace(".xnb", ""); 

    roofTextures.Add(DataCenter.AddTexture(DataCenter.Content.Load<Texture2D>(path))); 
} 

Этот метод получить все файлы в данный каталог, в данном случае, «Содержимое \ Текстуры \ Дома \ Крыша». И вот пришла ошибка: в этом каталоге есть три файла (все с расширением .xnb). На моем компьютере с win7 (и еще четыре компьютера другого парня с win7) эта работа, как и должно быть.

Но, когда кто-то с победой XP попытается запустить этот метод, ОС вернет 4 файла - и три действительно выходящих файла и один файл, открытый в последний раз с помощью OpenFileDialog (даже если файл в полностью другой директории, каталог.Getfiles вернет его, как он есть, в этом каталоге).

И когда я хочу его открыть, метод не найдет файл и не выдаст исключение.

Мне удалось преодолеть эту ошибку, проверив, имеет ли данный задний файл расширение .XNB, но эта ошибка действительно заставляет меня задуматься.

Любая идея, где я допустил ошибку?

Открытый файл в области winform, в то время как поиск и открытие файла в другой DLL, совершенно другой класс, в частном, неприемлемом методе - они не должны даже общаться каким-либо образом! Я не знаю, как, черт возьми, я вернул это имя файла.

Edit:

Я думаю, что я не сделал мою проблему ясно (извините за это :).

Итак, проблема в методе: когда я использую Directory.GetFiles (...), он возвращает три файла, которые действительно находятся в каталоге (три файла .xnb). Но для некоторых пользователей (с использованием Windows XP) этот метод возвращает одно расширение .sbm (тип файла, используемого моей программой), который ISNT внутри каталога. Я довольно долго искал, пока не узнал: эта проблема возникает только при использовании Openfiledialog - когда они это делают, каталог.GetFiles (...) вернет ранее открытый файл, как он есть, но phyisically это не так. Я смог решить эту проблему, но все же не могу понять, ПОЧЕМУ это может случиться. Я прошел через базу данных MSDN, но я ничего не узнал об этой ошибке. Я попытался воссоздать ошибку внутри VS, надеясь, что это даст ключ, но я не мог этого сделать. Однажды проблема появилась и для меня (из win7), но поскольку она была вне VS VS, я не смог отлаживать. В настоящее время только два пользователя, получивших XP XP, в то время как его работа отлично подходит для всех, кто использует win7.

О, и я дважды проверял - в этом каталоге нет скрытого файла (особенно ранее открытого файла). Только три желаемых файла внутри.)

Edit 2:

Вот ссылка для этой проблемы, а также шаги по созданию проблемы:

https://www.dropbox.com/s/4uv1hbvzkhpwprw/House%20Creator%20V2%20With%20error.zip

Запуск Housecreator.exe Нажмите на кнопку "Загрузить". Выберите «Пригородный дом 1.sbm»

При его загрузке нажмите кнопку «3D-рендеринг».

И это шаг, на котором должна появиться ошибка. Программа будет искать файл «Suburb house 1.sbm» в (Content) \ Textures \ Houses \ OuterWall (иногда в основном для пользователей xp, но иногда это происходит и для меня, но только снаружи от Visual Studio) ,

XNA framework 3.1 потребуется, а также .NET 3.5, чтобы попробовать программу. И ошибка появляется только в том случае, если пользователь использует опцию «load».

Редактировать 3: Я получил ошибку три раза подряд. Внутри данного каталога не было добавлено дополнительного файла. И теперь его работа снова, без каких-либо заметных изменений. O.o

У меня исходит из идей, почему это происходит.

Редакция 4:

Я сдал. Я уверен, что я что-то ошибаюсь (я не думаю, что это может быть эта огромная ошибка, и никто еще не заметил), но не могу понять, где она. Я фильтрую файлы, и это должно работать. Спасибо всем за помощь! :)

+0

Первый шаг - сузить, если ошибка исходит из Directory.GetFiles или из вашего собственного кода. Скорее всего, вы добавили что-то в 'roofTextures' и не понимаете этого. –

+0

Какое исключение и где? Как эта информация по финансированию может отсутствовать? Неудивительно, что вы не можете отлаживать! – banging

+0

Какая шутка пыталась сказать, можно было сказать: «Куда исключено исключение?» ... и можно было сказать без оскорблений. – hometoast

ответ

1

Если Directory.GetFiles() возвращает 4 файла, в каталоге, указанном в качестве аргумента, есть 4 файла.

Вы не можете увидеть их в проводнике Windows, если они скрыты, защищенные системные файлы и т.д.

Во всяком случае, ваше приложение не следует ожидать, чтобы увидеть только те файлы, его волнует в данной папке, у вас есть нет контроль над этим.

Решение проблемы заключается в том, чтобы отфильтровать файлы, о которых вы не заботитесь, и игнорировать их.

for (int i = 0; i < files.Length; i++) 
{ 
    if(files[i].EndsWith(".xnb")) 
    { 
     string path = files[i].Substring(BasicUtils.FindsubString(files[i], "Textures")).Replace(".xnb", ""); 

     roofTextures.Add(DataCenter.AddTexture(DataCenter.Content.Load<Texture2D>(path))); 
    } 
} 
+0

Да, я использовал это решение, но дважды проверяю, и указанный файл не существует. Не скрывать, ни что-либо - это физически в другом каталоге. Мы используем dropbox, а другие запускали программу из того же каталога, открывали тот же файл - и, хотя он работал для пользователей win7, он не работал для двух пользователей XP. (И я также использовал этот метод фильтрации, но я все еще не могу понять проблему). –