2009-12-04 3 views
2

Я что-то вроде n00b на C#, и мне трудно найти ответ на этот вопрос, поэтому, если на это уже есть ответы, смело смеяться надо мной (при условии, что вы также разделяете решение). :)Проверка пути к файлу с пробелами в C#

Я читаю XML-файл в форме GUI, где некоторые элементы являются путями к файлам, которые вводятся в объекты TextBox. Я перебираю элементы управления в форме и для каждого пути к файлу в каждом текстовом поле (lol, как и 20 из них в этой форме), я хочу использовать File.Exists(), чтобы убедиться, что это допустимый файл.

Проблема заключается в том, что путь к файлу может содержать пробелы и потенциально может быть действительным; однако File.Exists() говорит мне, что он недействителен, основываясь исключительно на пространствах. Очевидно, что я не могу жестко закодировать их и сделать что-то вроде

if (File.Exists(@"c:\Path To Stuff"))

и я попытался окружая путь с», как

if (File.Exists("\"" + contentsOfTextBox + "\""))

, но это не делает разницы. есть ли способ сделать это? Могу ли я избежать пространства каким-то образом?

Спасибо за ваше время. :)

+0

Можете ли вы распечатать путь, по которому вы фактически переходите на Exists, и проверить, существует ли файл, который был введен? –

+0

Yup, я могу распечатать пути просто отлично, после того как они были прочитаны из XML. Файлы, безусловно, есть. – dmn

ответ

4

File.Exists отлично работает с пробелами. Есть что-то еще, дающее вам проблему. Я буду пари.

Убедитесь, что ваш XML-считыватель не читает имя файла (части XML не позволяют пробелам, а некоторые читатели будут генерировать исключение, если они столкнутся с одним).

+0

Итак, когда File.Exist() возвращает false, у меня появляется MessageBox с полным пути к файлу, который, по-видимому, не существует. Читатель XML читает в именах файлов просто отлично. Кроме того, я могу заполнить свои объекты TextBox именами файлов из XML, и они тоже прекрасны; именно эта проверка вызывает эту проблему. Хорошее мышление. : \ – dmn

+0

Вы уверены, что файл существует? Убедитесь, что вы используете Directory.Exists, если вы ожидаете имя папки. –

+0

Я только что видел ваш ответ ниже. Единственное, что я могу придумать, это ваши настройки разрешений. Из документов: Если вызывающий объект не имеет достаточных разрешений для чтения указанного файла, исключение не генерируется, и метод возвращает false, независимо от наличия пути. –

0

Вы помните, как заменить \ на \\?

+1

'@" c: \ Path To Stuff "' является стенографической строкой и не требует, чтобы вы сбрасывали обратную косую черту. См. Http://msdn.microsoft.com/en-us/library/aa691090%28VS.71%29.aspx – Powerlord

+1

Он не использует этот синтаксис во втором примере. – adrianbanks

+0

Он не использует синтаксис, но «\» не будет символами escape, поскольку они уже находятся в переменной. –

2

Как сказал ответ, File.Exists работает с пробелами, если вы проверка существования каталога, однако, вы должны использовать Directory.Exists

0

Вы должны использовать youtStringValue.Trim(), чтобы удалить пробелы ведущий/конечный, и замените, чтобы удалить пробелы в строке, которую вы не хотите.

Кроме того, скорее используйте System.IO.Path.Combine, чтобы объединить эти строки.

+0

File.Exists обрезает конечные пробелы для вас. И как бы удаление пробелов с помощью Replace help, так как это закончилось бы чем-то вроде C: \ ProgramFiles \ ... который не существовал бы? – adrianbanks

+0

Если в текстовом поле пользователь вводил пробелы, которые не были предназначены, его можно удалить. –

1

Какая точная ошибка, которую вы получаете, когда File.Exists говорит, что это недействительно?

I Подозреваемый что вы проходите путь к каталогу, а не к файлу, который будет возвращать false. Если это так, чтобы проверить наличие каталога, используйте Directory.Exists.

3

@ "C: \ Путь к Stuff"

выше может быть каталогнефайл!

Следовательно, вы хотели бы использовать Directory.Exists!

@ "C: \ Путь набивать \ file.txt"

Если вы имели файл на конце пути, то вы будете использовать File.Exists!

+2

Фактически, «Путь к материалу» _could_ должен быть файлом, а не каталогом. Довольно редко есть файл без расширения, но это допустимо в каждой файловой системе, которую я когда-либо использовал (и я использовал немало). –

+0

Спасибо, Грегори; да, это был плохой пример с моей стороны, lol. Это действительно c: \ Path To Stuff \ file.txt. Я думаю, мой мозг хочет, чтобы он все еще находился в UNIX-land, где обычно нет расширений файлов :) – dmn

0

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

как только это сделано просто написать() на экран, где вы должны файлы, если это xml, то ваш xmlmapper будет достаточным

file.exists() следует использовать только в определенных обстоятельствах, если вы знаете, что он существует, но не тогда, когда могут быть пробельные символы или любой другой возможный пользовательский ввод

0

Вы можете использовать @ для строковых переменных:

string aPath = "c:\Path To Stuff\text.txt"; 
File.Exists(@aPath); 

Это должно решить любые проблемы с escape-символами, потому что я не думаю, что это действительно выглядит как пространство, являющееся проблемой.

1

Чтобы эхо Рон Уорхолик: убедитесь, что у процесса есть разрешения над целевой папкой. Я просто столкнулся с тем же «ошибкой», и это оказалось проблемой с разрешениями.

Смежные вопросы