Soru Bir SaveFileDialog ilk dizini ayarlanıyor?


Aşağıdaki davranışla bir SaveFileDialog istiyorum:

  • İlk kez açtığınızda, "Belgelerim" e gider.

  • Daha sonra, son seçilen klasöre gider. Bunu başarmanın en iyi yolu nedir?

InitialDirectory ayarlamazsam, exe dizinine gider - istediğim bu değil. Son seçilen dizini hatırlar - hatta infazlar arasında bile.

InitialDirectory öğesini ayarlarsam son seçilen dizini hatırlamaz. Tabii ki, son seçilen dizini kayıt defterine kaydedebilirim :( ama daha iyi bir çözüm arıyorum.

      SaveFileDialog dialog = new SaveFileDialog();
      //??? dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
      dialog.ShowDialog();

Herhangi bir tavsiye?


32
2017-07-24 00:33


Menşei




Cevaplar:


Ayarlamalısın RestoreDirectory için true yanı sıra InitialDirectory özelliği.


30
2017-07-24 00:36



Ah, RestoreDirectory bunun için ... - tom greene
Ayrıca programcıya "RestoreDirectory" ayarının true değerine ayarlandığını söylemediği şu ipucunu da görün: discuss.joelonsoftware.com/default.asp?dotnet.12.424113.2 - SLA80
Gerçekten mi? Benim için çalışmıyor. Her zaman InitialDirectory'a gider? - Patrick Klug
Aynı sorunu yaşadım, ama sonunda onu geçebiliyordum (bir örnek için bu soruya verdiğim cevabı görüyorum). Bazı nedenlerden ötürü, Path.GetFullPath () yoluna tam yolu iletmek ve sonra InitialDirectory dosyasını ayarlamak. - Jeffrey Harmon


Bunun neden işe yaradığına dair hiçbir fikrim yok ama sonunda benim için çalışmayı başarabiliyordum.

Yolun tamamını verirsem işe yaramazdım, ama eğer o yolun tam ortasına koyarsam Path.GetFullPath ()o zaman işe yarayacaktı. Önceden ve sonraki değerlere bakıldığında, bunların aynı olduklarını gösterirler, ama sürekli olarak onsuz çalışmayacak ve onunla çalışacaktır.

//does not work
OpenFileDialog dlgOpen = new OpenFileDialog();
string initPath = Path.GetTempPath() + @"\FQUL";
dlgOpen.InitialDirectory = initPath;
dlgOpen.RestoreDirectory = true;

//works
OpenFileDialog dlgOpen = new OpenFileDialog();
string initPath = Path.GetTempPath() + @"\FQUL";
dlgOpen.InitialDirectory = Path.GetFullPath(initPath);
dlgOpen.RestoreDirectory = true;

14
2018-01-19 04:46



Bu bana yardımcı olmadı (Windows 7, 64-bit, .net framework 4.5.1) - danio
@danio Windows 7 64-bit var ve bu benim için çalıştı. Uygulamam .NET 4 kullanıyor. - Dog Lover


İlk dizin özelliğini ayarlamadan önce dizin yolunun var olduğundan emin olun. Varsa dizin oluşturun. yani

if (!Directory.Exists(FooDirectory))
{
     Directory.CreateDirectory(FooDirectory);
}

4
2017-09-16 20:46



Directory.CreateDirectory (FooDirectory) öğesini çağırabilirsiniz ve dizin zaten varsa bir hata atmayacaktır. - Hagelt18


Ben de farklı yerlerde bulunan farklı "çözümleri" denedim, ancak hiçbiri kayıt defterinde bir MRU listesi girişi olduğu anda çalışmaz gibi görünmüyor: / Ama burada kendi basit bir çözümüm var…

Diyaloğu ayarlamak yerine InitialDirectory özelliği FileName yolunuza özellik, ancak seçilenle birleştirildi Filter, Örneğin.:

dialog.FileName = Path.Combine(myPath, "*.*");

3
2018-06-20 08:24



Bu bana yardımcı olmadı - sadece dosya adı alanında tam yol ve dosya adı ile bir diyalog açıldı, ancak gösterilen dizin (Windows 7, 64-bit, .net framework 4.5.1) - danio


Sağlanan çözümlerin hiçbiri benim için üzücü değildi.

OP özelliklerine ek olarak, programın çalışma arasındaki son kayıt konumunu hatırlamasını istedim. Bunun için, Visual Studios Solution Explorer altında ProjectName -> Properties -> Settings.settingsAşağıdaki özelliği ayarlıyorum:

Settings.settings property: Name=PreviousPath, Type=string, Scope=User, leave Value empty

Çünkü ben SaveFileDialog Programın çalışma süresi boyunca, en başından başladım. Sonra içinde Command iletişim kurmak için:

if (string.IsNullOrEmpty(Settings.Default.PreviousPath))
{
    this.saveDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
}
else
{
    this.saveDialog.InitialDirectory = Settings.Default.PreviousPath;
}

this.saveDialog.FileName = "Default_File_Name";

bool result = this.saveDialog.ShowDialog() ?? false;

if (result)
{
    Settings.Default.PreviousPath = Path.GetDirectoryName(this.saveDialog.FileName);
    Settings.Default.Save();

    // Code writing to the new file...
}

Bu davranış verir:

  • Program ilk kez çalıştırıldığında ve diyalog açıldığında "Belgelerim" e gider.
  • Ardışık çalışma ve iletişim kutusu açıldı:
    • Bir önceki açıkta kaydedilmişse, önceki kaydetme konumuna gider.
    • Bir önceki açıkta kaydedilmezse, "Belgelerim" bölümüne gider.

1
2017-10-06 23:09





Önerilen geçici çözümler benim için işe yaramadı. WPF OpenFileDialog en son açılan dosyanın dizinini nasıl? Uygulandım:

public static void SetInitialDirectory(this FileDialog dlg, string fileExtension, string initialDirectory)
        {
            // RestoreDirectory doesn't seem to be implemented - https://stackoverflow.com/questions/11144770/how-does-wpf-openfiledialog-track-directory-of-last-opened-file
            // so manually only set InitialDirectory if nothing is stored
            try
            {
                var mru = @"Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSavePidlMRU\" + fileExtension;
                var rk = Registry.CurrentUser.OpenSubKey(mru);
                if (rk == null)
                {
                    dlg.InitialDirectory = initialDirectory;
                }
            }
            catch (Exception)
            {
                // SecurityException, ObjectDisposedException => allow default behaviour
            }
        }

Bu, daha önce bu dosya uzantısı için kullanılmamışsa, sağlanan başlangıçDirectory değerini kullanır. Diyalog kullanıldıktan sonra, önceki dizinin hatırlanması varsayılan davranışına döner.


1
2018-01-29 11:11



+1 Sorunumu doğrudan düzeltmediyse de, sildiğiniz bir dizininiz varsa ve artık ilk dizini olmak istemiyorsanız işe yarar, ancak MRU'da takılı kalırsanız, gerçekten de dlg.InitialDirectory = initialDirectory; Başka bir şeye ayarlamak, null veya değil. Mine, hata ayıklaması sırasında bunu atladı jpg olarak fileExtension yanlışlıkla dosya adı ile bir dizin oluşturdum ve dosyayı içeride kaydettiğim bir JPG dosyası olduğundan, sorunu gidermek için klasörü sildim. Bir şekilde sadece o satırı çalıştırmak için hata ayıklayıcısını yedekleyip çalıştı ve bir yol belirledi. - vapcguy
Ve aslında, bulduğum şey doğru bir çevre yolu değişkeni kullanmıyordum, bu yüzden doğru yolu initialDirectory. Bu değişkeni hata ayıklayıcısından manuel olarak ayarlamak, neyin ayarlanmaya çalışıldığına karar vermeme ve bunu ayarlanabilmesi için el ile bir şeye ayarlamamı sağladı. Sorunun ne olduğunu anladığımda, farklı bir şekilde gittim, çünkü her zaman null Onu yeniden ayarladı, ama bu yardımcı oldu, bu yüzden doğru yol olduğunu düşündüğüm şeyleri iletmek için bir işlev görebildim, sadece gerçekten dağınık olduğum yeri bulmak için. :) - vapcguy


Bu ayarı buldum InitialDirectory için null İlk kullanıcı geçmişi etrafında çalışır.

    OpenFileDialog dlgOpen = new OpenFileDialog();
    dlgOpen.InitialDirectory = null;
    dlgOpen.InitialDirectory = @"c:\user\MyPath";

1
2017-10-16 02:11



Bunu ayarlamaya çalışmadı null benim için kullanıcı geçmişi sorunu önlemek için OpenSaveDialog(), önceki kaydetme yerini sildim. Yine de konumun bulunmadığı ve eski yerin hala gitmeye çalıştığı yer olduğu hatası var. - vapcguy
Sorunumun yolumda olduğunu anladım. Kodun üstünde iyi çalışır. Yanlış bir çevresel yol değişkeni kullanıyordum (%USERPROFILE%), yolumun yanlış olmasına neden oluyor, bu yüzden diyalog sadece son yolu kullandı - ki sildiğim o vardı. Yolun doğru olduğu sürece, bu onu ayarlayacaktır. :) - vapcguy


.NET 2.0 ile bazı testler yaptım ve FileName'i çalışmayan bir dizeden başka bir şeye ayarlıyorum. Özelliği ayarlamak için bir yöntem veya erişimci kullandığımda, ilk dizin yoksayılır.


0
2018-03-30 14:08





Yolunuzda herhangi bir yere eğik çizgi kullanırsanız, InitialDirectory çalışmaz. Geri eğimlere dönüştürüldüklerinden emin olun


0
2018-01-16 14:10





savefiledialog.InitialDirectory = Application.StartupPath;
savefiledialog.RestoreDirectory = true;

bir saniye önce test edildi.


0
2017-09-15 20:21





Bu benim sonlandırdığım şey, OP'nin diyaloglarını işaret etmek istediği yer ile birlikte gider:

Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
dlg.InitialDirectory = null;

// May or may not want "saves", but this shows how to append subdirectories
string path = (Path.Combine(Environment.ExpandEnvironmentVariables("%USERPROFILE%"), "My Documents") + "\\saves\\");  

if (!Directory.Exists(path))
    Directory.CreateDirectory(path);

dlg.InitialDirectory = path;
dlg.RestoreDirectory = true;

if (dlg.ShowDialog().Value == true)
{
    // This is so you can have JUST the directory they selected
    path = dlg.FileName.Remove(dlg.FileName.LastIndexOf('\\'), dlg.FileName.Length - dlg.FileName.LastIndexOf('\\'));

    string filePath = Path.Combine(path, fileName);

    // This is "just-in-case" - say they created a new directory in the dialog,
    // but the dialog doesn't seem to think it exists because it didn't see it on-launch?
    if (!Directory.Exists(path))
        Directory.CreateDirectory(path);

    // Remove a file if it has the same name
    if (File.Exist(filePath))
        File.Delete(filePath);

    // Write the file, assuming you have and pass in the bytes
    using (FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write)
    {
        fs.Write(bytes, 0, (int)bytes.Length);
        fs.Close();
    }
}

0
2018-05-23 14:05