Pliki bez rozszerzenia "*." - problem z FileDialog'ami

0

Witam

Mam problem z filtrowaniem plików tekstowych bez rozszerzenia w oknie OpenFileDialog. Zalezy mi na tym abym w otwartym oknie OpenFileDialog widział tylko pliki typu "*." nic wiecej. Właściwości plików do odfiltorwania przedstawiam niżej.

 
            FileInfo fi = new FileInfo(@"C:\Documents and Settings\Polly\Pulpit\UZYWANE\BLOKADA.");

            Console.WriteLine("FileInfo.Directory: " + fi.Directory);
            Console.WriteLine("FileInfo.Extension: >>>" + fi.Extension + "<<<");
            Console.WriteLine("FileInfo.Name: " + fi.Name + "<<<");
            Console.WriteLine("FileInfo.FullName: " + fi.FullName);
            Console.WriteLine(fi.Attributes);
            Console.ReadLine();

Wyniki:

FileInfo.Directory: C:\Documents and Settings\Polly\Pulpit\UZYWANE
FileInfo.Extension: >>><<<
FileInfo.Name: BLOKADA.<<<
FileInfo.FullName: C:\Documents and Settings\Polly\Pulpit\UZYWANE\BLOKADA
Archive

A tak wygląda przygotowanie obiektu typu OpenFileDialog:

 
openFileDialog1.Filter = "SIPRO Files (*.)|*.|All Files (*.*)|*.*";
openFileDialog1.FilterIndex = 1 ;

Jeżeli ustawię FilterIndex = 1, to nie widzę żądnych plików w oknie, jeżeli ustawię FilterIndex = 2 to będę widział wszystkie pliki w tym te na których mi zależy "." - __jak zrobić aby w oknie otwierania widoczne były TYLKO pliki typu "."?__
Z FilterIndex = 2 plik typu "*." jest otwierany prawidłowo nie ma z tym problemu.

I teraz się zorientowałem, żę w oknie SaveFileDialog też mam problem z tymi plikami. Podczas próby zapisu wyskakuje mi wyjątek "Illegal characters in path." po kliknięciu w oknie SaveFileDialog przycisku Zapisz.

Tak wygląda obsługa zapisywania pliku:

 StreamWriter writer;

            saveFileDialog1.FileName = label5.Text;   //czyli samo "BLOKADA"
//w oknie properties dodatkowo
Filter = "SIPRO Files (*.)|*.";
FilterIndex = 1 ;
RestoreDirectory = true;

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)   //<--- tu wyskakuje wyjątek "Illegal characters in path."
            {
                try
                {
                    if (saveFileDialog1.FileName != null)
                    {
                        using (writer = new StreamWriter(saveFileDialog1.OpenFile()))
                        {
                            for (int i = 0; i < progSipro.PobierzIloscLinii(); i++)
                            {
                                writer.WriteLine(progSipro.PobierzLinieProgramu(i));
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Szczegóły błędu: \n" + ex.Message , "Błąd zapisu pliku", MessageBoxButtons.OK);
                    writer = null;
                }
                
            }

Domyślam się że powodem tego wszystkiego może być brak rozszerzenia w nazwie pliku ale tego pewny nie jestem, mógły ktoś mnie nakierować w czym problem i jak go rozwiązać?

Właśnie sprawdziłem, że jak ustawię:

 
saveFileDialog1.Filter = "SIPRO Files (*.)|*.|All Files (*.*)|*.*";
saveFileDialog1.FilterIndex = 2 ;

to zapis wychodzi prawidłowo.

Więc, czy źle określam warunki filtrowania dla swojego typu plików "*." ?

1

Tak, nie da się ustawić takiego filtra dla FileDialogu. Co prawda na Viście i 7 IFileDialog pozwala na dodatkowe filtrowanie przez callback, ale .NET nie wystawił tej metody (bo w pre-Vista nie dało się tego robić). Dziedziczyć po Open/SaveFileDialog nie możesz, bo są sealed, po FileDialog też nie, bo ma metody internal abstract no i właściwie jedyne co możesz zrobić to napisać własne okienko zupełnie od postaw albo z użyciem IFileDialog. Lepiej własny, bo jak widać po dokumentacji, w Windows 8 może w ogóle ta metoda zniknąć.

0

Ok rozumiem, dzięki.
W takim razie wyjątek który mi tam wyskakuje dotycznie nie tyle niewłaściwego znaku co braku znaku rozszerzenia?

1 użytkowników online, w tym zalogowanych: 0, gości: 1