18

.Net'te, 'Özel klasörler' gibi belgeleri, Belgeler/Masaüstü vb. Gibi yollarla yeniden bulabiliriz. Bugün 'İndirilenler' klasörüne giden yolu bulmayı denedim, ancak göründüğü kadar özel değil.Program indirme yoluyla "% USERPROFILE%/Downloads" adlı pencere indirme klasörü nasıl oluşturulur?

Sadece 'C: \ Kullanıcılar \ Kullanıcı Adı \ Dosyalar' yapabileceğimi biliyorum, ancak bu çirkin bir çözüm gibi görünüyor. Peki yolu .Net kullanarak nasıl geri alabilirim?

cevap

0

sorunu senin ilk cevap, varsayılan İndirme Dir. [Download1] olarak değiştirilmişse, WRONG sonucunu verir! uygun yolu false size, tüm olasılıkları kapsayan özel olarak kişisel indirme dir arzu

using System; 
using System.Runtime.InteropServices; 

static class cGetEnvVars_WinExp { 
    [DllImport("Shell32.dll")] private static extern int SHGetKnownFolderPath(
     [MarshalAs(UnmanagedType.LPStruct)]Guid rfid, uint dwFlags, IntPtr hToken, 
     out IntPtr ppszPath); 

    [Flags] public enum KnownFolderFlags : uint { SimpleIDList = 0x00000100 
     , NotParentRelative = 0x00000200, DefaultPath = 0x00000400, Init = 0x00000800 
     , NoAlias = 0x00001000, DontUnexpand = 0x00002000, DontVerify = 0x00004000 
     , Create = 0x00008000,NoAppcontainerRedirection = 0x00010000, AliasOnly = 0x80000000 
    } 
    public static string GetPath(string RegStrName, KnownFolderFlags flags, bool defaultUser) { 
     IntPtr outPath; 
     int result = 
      SHGetKnownFolderPath (
       new Guid(RegStrName), (uint)flags, new IntPtr(defaultUser ? -1 : 0), out outPath 
      ); 
     if (result >= 0)   { 
      return Marshal.PtrToStringUni(outPath); 
     } else { 
      throw new ExternalException("Unable to retrieve the known folder path. It may not " 
       + "be available on this system.", result); 
     } 
    } 

} 

, bunu test etmek için bir bayrak varsayılan yapmak ->

using System.IO; 
class Program { 
    [STAThread] 
    static void Main(string[] args)  { 
     string path2Downloads = string.Empty; 
     path2Downloads = 
      cGetEnvVars_WinExp.GetPath("{374DE290-123F-4565-9164-39C4925E467B}", cGetEnvVars_WinExp.KnownFolderFlags.DontVerify, false); 
     string[] files = { "" }; 
     if (Directory.Exists(path2Downloads)) { 
      files = Directory.GetFiles(path2Downloads); 
     } 
    }//Main 
} 

Ya da sadece bir satır [ kullanarak Environment.ExpandEnvironmentVariables()] -> (basit çözüm)

using System.IO; 
class Program { 
    [STAThread] 
    static void Main(string[] args)  { 
     string path2Downloads = string.Empty; 
     string[] files = { "" }; 
     path2Downloads = Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads"); 
     if (Directory.Exists(path2Downloads)) { 
      files = Directory.GetFiles(path2Downloads); 
     } 
    }//Main 
} 
19

Evet, bu klasörün adını keşfederek Vista'ya kadar mümkün olmadığını keşfetti. .NET'in önceki işletim sistemlerini desteklemesi gerekiyor. Bunu, bu sınırlamayı aşmak için SHGetKnownFolderPath() PInvoke edebilirsiniz:

using System.Runtime.InteropServices; 
... 

public static string GetDownloadsPath() { 
    if (Environment.OSVersion.Version.Major < 6) throw new NotSupportedException(); 
    IntPtr pathPtr = IntPtr.Zero; 
    try { 
     SHGetKnownFolderPath(ref FolderDownloads, 0, IntPtr.Zero, out pathPtr); 
     return Marshal.PtrToStringUni(pathPtr); 
    } 
    finally { 
     Marshal.FreeCoTaskMem(pathPtr); 
    } 
} 

private static Guid FolderDownloads = new Guid("374DE290-123F-4565-9164-39C4925E467B"); 
[DllImport("shell32.dll", CharSet = CharSet.Auto)] 
private static extern int SHGetKnownFolderPath(ref Guid id, int flags, IntPtr token, out IntPtr path); 
+1

lokalize Windows üzerinde bu işi yapmak için bir yol Vista öncesinde var mı? Yani 'Path.Combine (yol," Downloads ");' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

+0

Muhtemelen bir yere kayıt defterinden kazabilirsiniz. Nerede olduğunu bilmiyorum, uzun zaman önce XP'den emekli oldum. Regedit.exe onu bulmak için yararlıdır. –

+0

Neden "SHGetKnownFolderPath" kullanılmalı ve "Environment.SpecialFolder" kullanılmıyor? – Kiquenet

-3

VB için deneyin ...

Dim strNewPath As String = IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)) + "\Downloads\" 
+1

Bu yanlış, s. Burada benim açıklamaları: http://www.codeproject.com/Articles/878605/Getting-all-Special-Folders-in-NET –

+0

Burada kod yolu yok. Kullanıcı bu klasörü başka bir yere taşıdı (8, 8.1 ve 10'da oldukça kolay). –

0

Ben denemek:

Dim Dd As String = Environment.GetFolderPath(Environment.SpecialFolder.Favorites) 
Dim downloD As String = Dd.Replace("Favorites", "Downloads") 
txt1.text = downLoD 
+0

6 yıl önce gönderilen ve cevaplanan bir soruyu yanıtlama - Lütfen çözümünüzün neden daha iyi kullanıldığını açıklayın. Mevcut bir –

+0

*** Lütfen çözümün neden mevcut olandan daha iyi olduğunu açıklayın ***? SHGetKnownFolderPath' kullanmamanız daha iyi? – Kiquenet

+2

** Tanrının çözümü değil: ** 'Kullanıcı klasörü başka bir konuma taşıdı (8, 8.1 ve 10'da oldukça kolay).' [.NET'te Tümü "Özel Klasörleri Al"] (https: // www.codeproject.com/articles/878605/getting-all-special-folders-in-net) – Kiquenet