รับเส้นทางของโฮมไดเร็กทอรีใน C #?


106

โอเคฉันตรวจสอบ Environment.SpecialFolder แล้ว แต่ไม่มีอะไรในนั้น

ฉันต้องการรับโฮมไดเร็กทอรีของผู้ใช้ปัจจุบันใน C # (เช่นc:\documents and settings\userภายใต้ XP c:\users\userภายใต้ Vista และ/home/userภายใต้ Unix)

ฉันรู้ว่าฉันสามารถอ่านตัวแปรสภาพแวดล้อมเพื่อค้นหาสิ่งนี้ได้ แต่ฉันต้องการทำสิ่งนี้ด้วยวิธีข้ามแพลตฟอร์ม

มีวิธีใดบ้างที่ฉันสามารถทำได้ด้วย. NET (ควรใช้ mscorlib)

UPDATE : โอเคนี่คือรหัสที่ฉันใช้:

string homePath = (Environment.OSVersion.Platform == PlatformID.Unix || 
                   Environment.OSVersion.Platform == PlatformID.MacOSX)
    ? Environment.GetEnvironmentVariable("HOME")
    : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%");

2
บูม. ปืนที่เร็วที่สุดในตะวันตก: P
Boris Callens

Dunno เกี่ยวกับเครื่องของคุณ แต่ในกล่อง XP ของฉัน% HOMEDRIVE %% HOMEPATH% เป็นไดเรกทอรีเครือข่ายไม่ใช่ c: \ Documents and Settings \ user \ MSalters \
MSalters

พูดตามตรงฉันคิดว่าปัญหาที่แน่นอนนี้เป็นการใช้งาน. NET น้อยเกินไป ... คุณควรดูเอกสารสำหรับ CSIDLS ( msdn.microsoft.com/en-us/library/bb762494.aspx ) เพื่อดูรายการทั้งหมด สิ่งที่ Windows รองรับ: สิ่งที่คุณกำลังมองหาคือ CSIDL_PROFILE ซึ่งได้รับการสนับสนุนใน Windows แต่ไม่ใช่โดย. NET ด้วยเหตุผลที่ไม่อาจหยั่งรู้ได้
Matthew Scharley

1
ฉันคิดว่าคุณควรใส่ผลลัพธ์เป็นคำตอบในครั้งต่อไป
Peteter

PlatformID.MacOSX ไม่จำเป็น PlatformID.Unix คืนค่าจริงบน MacOSX ด้วย (หรืออย่างน้อยที่สุดก็เคย)
Stefan Steiger

คำตอบ:


52

Environment.SpecialFolder.Personalไม่จริงกลับโฟลเดอร์บ้านก็ส่งกลับเอกสารของฉันโฟลเดอร์ วิธีที่ปลอดภัยที่สุดที่จะได้รับโฮมโฟลเดอร์บน Win32 %HOMEDRIVE%%HOMEPATH%คือการอ่าน การอ่านตัวแปรสภาพแวดล้อมนั้นพกพาไปได้มาก (ทั้งในระบบ Unix และ Windows) ดังนั้นฉันจึงไม่แน่ใจว่าทำไมผู้โพสต์ถึงไม่อยากทำ

แก้ไขเพื่อเพิ่ม:สำหรับ crossplatform (Windows / Unix) C # ฉันจะอ่าน$HOMEบน Unix และ OSX และ%HOMEDRIVE%%HOMEPATH%บน Windows


ฉันรู้ว่าจริงๆแล้ว HOMEDRIVE ไม่มีอยู่ใน * nix และโดยปกติมันเป็นแค่ HOME ไม่ใช่ HOMEPATH
Matthew Scharley

Matthew คุณพูดถูก ฉันได้เพิ่มคำชี้แจงในความคิดเห็นเดิม
sigint

12
คุณไม่สามารถใช้% USERPROFILE% บน Windows ได้หรือไม่?
Lucas Jones

1
$ HOME ทำงานบน OS X ด้วย นี่ยังไม่ใช่คำตอบที่ถูกต้องเท่าที่ฉันกังวลเนื่องจากคุณกำลังทำการตรวจจับแพลตฟอร์ม ... แต่เพื่อให้ได้ค่าที่แน่นอนที่ถามนั่นคือสิ่งที่คุณต้องทำ
Matthew Scharley

2
person-b,% USERPROFILE% และ% HOMEDRIVE %% HOMEPATH% มักจะเหมือนกันบนพีซีส่วนบุคคล แต่มักจะชี้ไปที่ตำแหน่งต่างๆในสภาพแวดล้อมเครือข่าย เช่นในที่ทำงาน USERPROFILE ของฉันคือ C: \ Documents and Settings \ ชื่อผู้ใช้ แต่โฮมไดเร็กทอรีคือ Z: \ ซึ่งเป็นไดรฟ์เครือข่ายที่ IT สำรองข้อมูลเป็นประจำ
sigint

97
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

ส่วนบุคคลคือเอกสารของฉัน (หรือเอกสารใน win7 ขึ้นไป)


8
โปรดทราบว่า UserProfile เป็นของใหม่ใน. NET 4.0 หากคุณใช้. NET 2.0 / 3.5 คุณต้องเรียกใช้ win32 API ด้วยตนเองด้วยค่า 40 สำหรับ UserProfile
linquize

และ "เอกสารของฉัน" ไม่เหมือนกับโฮมไดเร็กทอรียกเว้นใน Windows 95, 98 และ ME
Jon Hanna

2
อย่าลืมใช้ System.IO.Path.DirectorySeparatorChar เพื่อสร้างเส้นทางไฟล์ของคุณเพื่อให้พกพาได้
thomiel

5
อย่าใช้ DirectorySeperatorChar ด้วยตนเอง ใช้ Path.Combine
John Gietzen

15

ฉันเชื่อว่าสิ่งที่คุณกำลังมองหาคือ:

System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)

mscorlibสำหรับการอ้างอิงมันมีอยู่ใน Infact


ซึ่งจะส่งคืนโฟลเดอร์ My Documents
MiffTheFox

"เอกสารของฉัน" เป็นสิ่งที่ใกล้เคียงที่สุดที่ Windows มีในโฮมไดเร็กทอรี
MSalters

8
@MStallers ไม่ใช่% HOMEDRIVE %% HOMEPATH% คือ
MiffTheFox

ไม่มาก ... แต่ทางเลือกอื่นคือ PInvoke และ OP ขอโซลูชันที่มีการจัดการ
Matthew Scharley

7
โปรดทราบว่า Environment.SpecialFolder.UserProfile พร้อมใช้งานใน. NET 4.0 ซึ่งเป็นสิ่งที่คุณต้องการ
linquize

8

ใน DotNetCore 1.1 System.Environment.SpecialFolderไม่มีอยู่ อาจมีอยู่ใน 2.0-beta ในระหว่างนี้คุณสามารถใช้สิ่งต่อไปนี้:

var envHome = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "HOMEPATH" : "HOME";
var home = Environment.GetEnvironmentVariable(envHome);`

ฉันใช้ 2.0 และSystem.Environment.SpecialFolderมีอยู่
snotyak

4

คำตอบบรรทัดล่างคือไม่เป็นวิธีที่ใช้ระบบอย่างง่ายใน. NET เพื่อรับโฮมไดเร็กทอรีซึ่งเราคาดว่าจะมีการใช้งานทั้งใน. NET บน Windows และใน Mono

คุณจะต้องทำการตรวจหาระบบปฏิบัติการและแยกไปยังรหัสเฉพาะของระบบปฏิบัติการ


1

เมื่อคุณพูดข้ามแพลตฟอร์มระบบปฏิบัติการอื่น ๆ ที่คุณต้องการรองรับคืออะไร? คุณอาจต้องทำการตรวจหาระบบปฏิบัติการแบบง่ายๆเพื่อเลือกวิธีการค้นหาโฮมไดเร็กทอรีหากคุณใช้งานระบบปฏิบัติการที่ไม่ใช่ Windows

ดูเหมือนว่าเว็บไซต์นี้จะให้วิธีทำสิ่งที่คุณต้องการใน Windows


เว้นแต่คุณจะใช้ braindead การนำ Framework Environment ไปใช้งาน GetFolder () ควรทำงานข้ามแพลตฟอร์ม
R.Martinho Fernandes

2
ควร การใช้งาน MS ไม่ได้ทำ
R.Martinho Fernandes

1

สามารถทำได้โดยใช้GetEnvironmentVariableในSystem.IO:

public string GetUserHome() {
    var homeDrive = Environment.GetEnvironmentVariable("HOMEDRIVE");
    if (!string.IsNullOrWhiteSpace(homeDrive))
    {
        var homePath = Environment.GetEnvironmentVariable("HOMEPATH");
        if (!string.IsNullOrWhiteSpace(homePath))
        {            
            var fullHomePath = homeDrive + Path.DirectorySeparatorChar + homePath;
            return Path.Combine(fullHomePath, "myFolder");
        }
        else
        {
            throw new Exception("Environment variable error, there is no 'HOMEPATH'");
        }
    }
    else
    {
        throw new Exception("Environment variable error, there is no 'HOMEDRIVE'");
    }
}

จากนั้นจะสร้างภายใต้หน้าต่าง: C:\\\\Users\\myusername\\myFolder

โปรดทราบว่าหากคุณใช้

var fullHomePath = Path.Combine(homeDrive.ToString(), homePath.ToString())

มันล้มเหลวเพราะสร้าง: \\Users\\myusername\\myFolder


0

ฉันไม่มีเครื่องให้ทดสอบ แต่%HOMESHARE%อาจใช้ได้กับคุณ มิฉะนั้นนี่เป็นสิ่งที่ดีงามรายชื่อของตัวแปรสภาพแวดล้อม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.