2013-09-11 6 views
3

моя программа имеет сохранения файла вариант, который приведен ниже:Save File Dialog, ограничить имя

 //Browse for file 
     SaveFileDialog ofd = new SaveFileDialog(); 
     ofd.Filter = "CSV|*.csv"; 
     ofd.DefaultExt = ".csv"; 

     DialogResult result = ofd.ShowDialog(); 
     string converted = result.ToString(); 

     if (converted == "OK") 
     { 
      Master_Inventory_Export_savePath.Text = ofd.FileName; 
     } 

, если я пишу имя файла в качестве «примера» он правильно сохраняет в формате CSV, однако, если я установил имя как «example.txt», он сохраняет как текстовый файл, я смотрел на msdn и т. д., но даже установка расширения по умолчанию не мешает этому, любые идеи о том, как разрешать файлы CSV только для сохранения?

+0

Немного вопросов. 1-й: почему h *** вы конвертируете DialogResult в строку? 2nd: если пользователь намеренно добавляет расширение ... почему вы должны изменить его на что-то еще? Вы были бы счастливы, если бы Блокнот изменил ваше расширение на .txt, когда вы пытаетесь сохранить HTML-файл, который вы написали? –

+0

@Adriano Я добавляю расширение csv, но мне нужно выполнить эту проверку, чтобы удалить .txt или другое расширение, чтобы система работала, если пользователь вводит неправильное расширение – user2678756

+0

_ «... если пользователь намеренно добавляет ...» _. Я бы расстроился, если напишу A.TXT, и Excel сохранит A.CSV, потому что я выбрал формат CSV ** **. Это лучше сказать, чтобы пользователь не указал другое расширение, если вы этого не хотите (по крайней мере, он не удивится, если не найдет того, что он просил). –

ответ

7

Вы можете использовать FileOk событие, чтобы проверить, какие ваши пользовательские типы и отказаться от ввода, если это что-то типа, что вы не» t нравится.

Например:

SaveFileDialog sdlg = new SaveFileDialog(); 
sdlg.FileOk += CheckIfFileHasCorrectExtension; 
sdlg.Filter = "CSV Files (*.csv)|*.csv"; 
if(sdlg.ShowDialog() == DialogResult.OK) 
    Console.WriteLine("Save file:" + sdlg.FileName); 

void CheckIfFileHasCorrectExtension(object sender, CancelEventArgs e) 
{ 
    SaveFileDialog sv = (sender as SaveFileDialog); 
    if(Path.GetExtension(sv.FileName).ToLower() != ".csv") 
    { 
     e.Cancel = true; 
     MessageBox.Show("Please omit the extension or use 'CSV'"); 
     return; 
    } 
} 

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

BEWARE что SaveFileDialog автоматически добавляет ваше расширение, если оно не распознает расширение, введенное вашим пользователем. Это означает, что если ваш пользователь набирает somefile.doc, тогда SaveFileDialog не добавляет расширение .CSV, потому что расширение .DOC, вероятно, хорошо известно в ОС. Но если ваш пользователь вводит somefile.zxc, то вы получаете как выход (а также в событии FileOk) имя файла под названием somefile.zxc.csv

+0

Спасибо Стив. Я использовал этот метод, чтобы запретить перезаписывать (только новые файлы) в VB.net - SaveFileDialog объявляется как * private WithEvents * и обработчик * Обрабатывает dialog.FileOk *, устанавливает * dialog.OverwritePrompt = False *, чтобы подавить сообщение о перезаписывании системы, чтобы диалог перескакивает прямо в сообщение с сообщением «Перезаписать НЕ разрешено» - именно то, что я искал! –

-1

AddExtensiontrue.

ofd.AddExtension = true; 
+0

Он добавит расширение только в том случае, если оно не используется. –

+0

@AurelienC Я пробовал это, но все же, если я вхожу в имя файла как Exampl.txt, он сохраняет файл txt – user2678756

1

Можете ли вы не просто форсировать файл .csv, так и в последнем блоке кода?

if (converted == "OK") 
{ 
    if (ofd.FileName.toString.EndsWith(".csv")<1) 
    { 
    Master_Inventory_Export_savePath.Text = ofd.FileName + ".csv"; 
    } 
    else 
    { 
    Master_Inventory_Export_savePath.Text = ofd.FileName; 
    } 
} 

Примечание - не тестировалось, но должно дать вам отправную точку ....

+0

Я бы не проверял расширение файла с помощью ... IndexOf !!! –

+0

, если FileName «csv.other», это не сработает –

+0

Да, это столкнулось с проблемами с краевыми случаями ... Ответ Стива немного более совершенен, чем это, это была просто мысль. Хотя я обновил его немного, чтобы работать вокруг сценария csv.other. – user2366842