C# String EndsWith Возвращает истинную проблему
Я открываю файл с помощью диалога OpenFile и хочу подтвердить, что файл в формате Excel.
Файл, который я открыл, - "C:\Desktop\Distribution.xls", но оба критерия моего оператора if оцениваются как true. Есть ли другой метод, который я должен использовать?
DialogResult result = openFileDialog1.ShowDialog();
if (result==DialogResult.OK)
{
file = openFileDialog1.FileName;
file = file.Trim();
if (!file.EndsWith(".xlsx")||!file.EndsWith(".xls"))
{
MessageBox.Show("Incorrect file format. Please save file in an .xls format");
}
else
{
book = application.Workbooks.Open(file);
sheet = (Worksheet)book.Worksheets[1];
range = sheet.get_Range("A1", "A1".ToString());
range.EntireRow.Delete(XlDirection.xlUp);
sheet.Cells[1, 2].EntireColumn.NumberFormat = "@";
book.SaveAs(csvConverstion, XlFileFormat.xlCSV);
book.Close(false, Type.Missing, Type.Missing);
application.Quit();
}
5 ответов
Вы должны использовать "&&" вместо "||"
Оператор If не может быть ложным, потому что вы пытаетесь оценить, что он заканчивается двумя разными строками одновременно (что невозможно).
Вы хотите сказать: "Если файл не заканчивается на.xlsx, а также не заканчивается на.xls, он недействителен"
Заменить это:
if (!file.EndsWith(".xlsx")||!file.EndsWith(".xls"))
С:
if (!file.EndsWith(".xlsx") && !file.EndsWith(".xls"))
Альтернативные решения:
Используйте лучше читаемую структуру, без отрицательного "IF", например:
if (file.EndsWith(".xlsx") || file.EndsWith(".xls"))
{
//Do stuff
}
else
{
//Invalid
}
Или, как предлагается в комментариях:
string ext = Path.GetExtension(openFileDialog1.FileName);
if(ext.Equals(".xls") || ext.Equals(".xlsx"))
{
// Do stuff
}
else
{
// Invalid
}
Состояние !file.EndsWith(".xlsx") || !file.EndsWith(".xls")
никогда не сможет вернуть истину. Потому что имя файла не может заканчиваться как .xlsx
а также .xls
,
Правильное условие с оператором "и": !file.EndsWith(".xlsx") && !file.EndsWith(".xls")
,
Старайтесь избегать негативов в операторах if. Если вы переключаете блоки вокруг, вы можете сделать тест, чтобы увидеть, является ли имя файла действительным, как это
if (file.EndsWith(".xlsx")||file.EndsWith(".xls"))
{
book = application.Workbooks.Open(file);
sheet = (Worksheet)book.Worksheets[1];
range = sheet.get_Range("A1", "A1".ToString());
range.EntireRow.Delete(XlDirection.xlUp);
sheet.Cells[1, 2].EntireColumn.NumberFormat = "@";
book.SaveAs(csvConverstion, XlFileFormat.xlCSV);
book.Close(false, Type.Missing, Type.Missing);
application.Quit();
}
else
{
MessageBox.Show("Incorrect file format. Please save file in an .xls format");
}
Это гораздо более читабельно и проще для понимания.
В дополнение к тому, что все сказали, вы можете найти FileDialog.Filter
свойство полезно.
Вы можете использовать его для ограничения разрешенных расширений следующим образом:
openFileDialog1.Filter = "Excel workbooks(*.xls;*.xlsx)|*.xls;*.xlsx";
При этом будут показаны только файлы с расширениями ".xls" и ".xlsx", и у пользователя не останется выбора, кроме как выбрать файлы с правильными расширениями.
Кроме того, если вы решили проверить расширение файла, вам следует использовать сравнение без учета регистра, поскольку очень часто можно найти пути с расширениями в верхнем регистре (например, "SomeName.XLSX"). Вы можете сделать это, используя String.Equals
метод:
string ext = System.IO.Path.GetExtension(file);
if (!string.Equals(ext, ".xls", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(ext, ".xlsx", StringComparison.OrdinalIgnoreCase))
{
//...
}
Обратите внимание, что даже если вы использовали FileDialog.Filter
может потребоваться подтвердить, что выбранный файл имеет правильное расширение в FileDialog.FileOk
событие, потому что OpenFileDialog может позволить выбрать ярлыки, которые ссылаются на файлы с различными расширениями, даже если допустимые расширения ограничены Filter
имущество.
Просто еще одно улучшение, которое слишком долго для комментария. Если вы хотите проверить расширения, используйте System.IO.Path.GetExtension
, Вы можете хранить действительные расширения в коллекции. Также учтите, что расширение может быть .XLS
который действителен, но не с вашим кодом.
string[] validExt = {".xls",".xlsx"};
string extension = System.IO.Path.GetExtension(openFileDialog1.FileName);
bool fileValid = validExt.Contains(extension, StringComparer.InvariantCultureIgnoreCase);
if(!fileValid)
{
// ...
}