C # String EndsWith Возвращает истинную проблему - PullRequest
0 голосов
/ 02 мая 2018

Я открываю файл с помощью диалога 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 ]

0 голосов
/ 02 мая 2018

В дополнение к тому, что сказали все, может оказаться полезным свойство 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.

0 голосов
/ 02 мая 2018

Еще одно улучшение, которое слишком длинное для комментария. Если вы хотите проверить расширения, используйте 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)
{
   // ...
}
0 голосов
/ 02 мая 2018

Условие !file.EndsWith(".xlsx") || !file.EndsWith(".xls") никогда не может вернуть true. Потому что имя файла не может заканчиваться как .xlsx, так и .xls.

Правильное условие с оператором "и": !file.EndsWith(".xlsx") && !file.EndsWith(".xls").

0 голосов
/ 02 мая 2018

Старайтесь избегать негативов в операторах 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");
    }

Это гораздо удобнее для чтения и понимания.

0 голосов
/ 02 мая 2018

Вы должны использовать «&&» вместо «||»

Оператор 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...