ฉันจะสร้างไฟล์และโฟลเดอร์ได้อย่างไรหากไม่มีโฟลเดอร์


140

ลองนึกภาพว่าฉันต้องการสร้าง (หรือเขียนทับ) ไฟล์ต่อไปนี้: - C:\Temp\Bar\Foo\Test.txt

ใช้วิธีFile.Create (.. )ก็สามารถทำได้

แต่ถ้าฉันไม่มีโฟลเดอร์ใดโฟลเดอร์หนึ่งต่อไปนี้ (จากเส้นทางตัวอย่างด้านบน)

  • อุณหภูมิ
  • บาร์
  • ฟู

จากนั้นฉันได้รับDirectoryNotFoundExceptionโยน

ดังนั้น .. เมื่อกำหนดเส้นทางแล้วเราจะสร้างโฟลเดอร์ทั้งหมดที่จำเป็นในการสร้างไฟล์ซ้ำ .. สำหรับเส้นทางนั้นได้อย่างไร? หากมีโฟลเดอร์ Temp หรือ Bar แต่ Foo ไม่ ... ก็จะถูกสร้างขึ้นด้วย

เพื่อความเรียบง่ายสมมติว่าไม่มีปัญหาด้านความปลอดภัย - สิทธิ์ทั้งหมดใช้ได้ดี ฯลฯ



คำตอบ:


126
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
    Directory.GetCreationTime(path));

ดูหน้านี้ MSDN

หวังว่าจะช่วยได้!


82
คุณสามารถโทรสุ่มสี่สุ่มห้าDirectory.CreateDirectoryโดยไม่ต้องDirectory.Existsตรวจสอบก่อน - จะไม่เกิดปัญหาหากมีไดเรกทอรีอยู่แล้ว
Tim Robinson

1
@ ทิม: ไม่แน่ใจก็เลยโยนมันไปที่นั่นใคร ขอบคุณสำหรับข้อมูล
Christopher B.Adkins

24
และอย่าลืมPath.GetDirectoryName(string path)รับไดเรกทอรีจากเส้นทางแบบเต็มของคุณ
Oliver

@Oliver: มีฟังก์ชันมากมายที่เข้ากันได้กับคลาส Directory และ DirectoryInfo แต่รหัสที่ฉันให้ก็เพียงพอที่จะผลักดันให้เขาไปในทิศทางที่ถูกต้อง ฉันคิดว่าลิงก์ยังขยายได้ไม่น้อย
Christopher B.Adkins

9
* หมายเหตุ: ตัวแปรpathไม่ควรมีชื่อไฟล์ ดังนั้นการใช้ตัวอย่าง OP ที่ควรจะเป็นpath C:\Temp\Bar\Fooหลังจากโทรแล้วDirectory.CreateDirectory(path);คุณยังต้องโทรFile.Create("C:\Temp\Bar\Foo\Test.txt");เพื่อสร้างไฟล์
sazr

146

เพื่อสรุปสิ่งที่แสดงความคิดเห็นในคำตอบอื่น ๆ :

//path = @"C:\Temp\Bar\Foo\Test.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path));

Directory.CreateDirectory จะสร้างไดเร็กทอรีแบบวนซ้ำและหากมีไดเร็กทอรีอยู่แล้วก็จะส่งคืนโดยไม่มีข้อผิดพลาด

หากมีไฟล์เกิดขึ้นFooที่C:\Temp\Bar\Fooข้อยกเว้นจะถูกโยนทิ้ง


หากคุณกำลังจัดการกับเส้นทางที่ยาว (256+) โปรดดูstackoverflow.com/questions/5188527/…
Alexei Levenkov


4

. กำหนดเส้นทางเราจะสร้างโฟลเดอร์ทั้งหมดที่จำเป็นในการสร้างไฟล์ซ้ำได้อย่างไร ..

สร้างไดเร็กทอรีและไดเร็กทอรีย่อยทั้งหมดตามที่ระบุโดยพา ธ

Directory.CreateDirectory(path);

จากนั้นคุณสามารถสร้างไฟล์


2
เส้นทางที่ไม่มีชื่อไฟล์ :)
Sameera R.

1
"ไดเรกทอรีและไดเรกทอรีย่อยทั้งหมด" ไม่ถูกต้อง: จะสร้างไดเร็กทอรีหนึ่งไดเร็กทอรีและไดเร็กทอรีย่อยที่จำเป็นทั้งหมด
Camilo Terevinto

4

คุณจะต้องตรวจสอบทั้งสองส่วนของเส้นทาง (ไดเรกทอรีและชื่อไฟล์) และสร้างแต่ละส่วนหากไม่มีอยู่

ใช้File.ExistsและDirectory.Existsค้นหาว่ามีอยู่จริงหรือไม่ Directory.CreateDirectoryจะสร้างเส้นทางทั้งหมดให้คุณดังนั้นคุณจะต้องเรียกสิ่งนั้นเพียงครั้งเดียวหากไม่มีไดเร็กทอรีจากนั้นให้สร้างไฟล์


สำหรับ Directory.CreateDirectory คุณไม่จำเป็นต้องดูว่ามีส่วนใดอยู่ จะสร้างไดเร็กทอรีทั้งหมดที่จำเป็น (สิ่งเดียวที่ต้องแน่ใจคือไดเร็กทอรีเป้าหมายไม่มีอยู่แล้ว)
Gertjan

ฉันขอแนะนำให้ลบบรรทัดแรกของคำตอบของคุณในกรณีนั้นเนื่องจากเขาไม่จำเป็นต้องตรวจสอบแต่ละส่วนจากรากเพียงตรวจสอบเส้นทางที่สมบูรณ์และสร้างขึ้นหากไม่มีอยู่
Gertjan

@Gertjan - อัปเดตคำตอบแล้ว ... หวังว่าจะเป็นไปตามมาตรฐานของคุณตอนนี้;)
Oded

:) มันทำ :) (ไม่ใช่ประเด็นของฉันที่จะพิสูจน์ว่าคุณผิดหรือทำให้คุณขุ่นเคือง แต่ผู้เริ่มต้นสามารถใช้คำชี้แจงใด ๆ ในคำตอบ)
เกอร์จัน


0

คุณต้องการ Directory.CreateDirectory ()

นี่คือคลาสที่ฉันใช้ (แปลงเป็น C #) ซึ่งถ้าคุณส่งไดเรกทอรีต้นทางและปลายทางมันจะคัดลอกไฟล์และโฟลเดอร์ย่อยทั้งหมดของไดเร็กทอรีนั้นไปยังปลายทางของคุณ:

using System.IO;

public class copyTemplateFiles
{


public static bool Copy(string Source, string destination)
{

    try {

        string[] Files = null;

        if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
            destination += Path.DirectorySeparatorChar;
        }

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

        Files = Directory.GetFileSystemEntries(Source);
        foreach (string Element in Files) {
            // Sub directories
            if (Directory.Exists(Element)) {
                copyDirectory(Element, destination + Path.GetFileName(Element));
            } else {
                // Files in directory
                File.Copy(Element, destination + Path.GetFileName(Element), true);
            }
        }

    } catch (Exception ex) {
        return false;
    }

    return true;

}



private static void copyDirectory(string Source, string destination)
{
    string[] Files = null;

    if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
        destination += Path.DirectorySeparatorChar;
    }

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

    Files = Directory.GetFileSystemEntries(Source);
    foreach (string Element in Files) {
        // Sub directories
        if (Directory.Exists(Element)) {
            copyDirectory(Element, destination + Path.GetFileName(Element));
        } else {
            // Files in directory
            File.Copy(Element, destination + Path.GetFileName(Element), true);
        }
    }

}

}


2
ฉันควรดาวน์เกรดเพราะแนวนี้: using Microsoft.VisualBasic;Evil !!
Pure.Krome

2
แล้วทำไม Microsoft.VisualBasic จึงชั่ว ?? มันเป็นแอสเซมบลีที่เหมือนกับใคร ๆ ใน. Net Framework
Oliver

2
ฉันคิดว่าเป็นเพราะคุณนำเข้าเนมสเปซของภาษาอื่นโดยไม่จำเป็น .. ?
Markive

0

สมมติว่าแอสเซมบลี / exe ของคุณมีสิทธิ์FileIOนั้นเองก็ไม่ถูกต้อง แอปพลิเคชันของคุณอาจไม่ทำงานด้วยสิทธิ์ของผู้ดูแลระบบ สิ่งสำคัญในการพิจารณาCode Access Securityและการขอ สิทธิ์ ตัวอย่างรหัส:

FileIOPermission f2 = new FileIOPermission(FileIOPermissionAccess.Read, "C:\\test_r");
f2.AddPathList(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, "C:\\example\\out.txt");
try
{
    f2.Demand();
}
catch (SecurityException s)
{
    Console.WriteLine(s.Message);
}

ทำความเข้าใจกับ. NET Code Access Security

“ Code Access Security” มีการใช้งานจริงหรือไม่


1
@ Pure.Krome: แม้ว่าคำตอบของฉันจะไม่ตรงเป้าหมาย แต่ก็ยังคงคำนึงถึงความปลอดภัยและการควบคุมการเข้าถึงเมื่อเข้าถึงทรัพยากรที่มีสิทธิพิเศษ ไม่ได้ตั้งใจที่จะแซงหรือทำให้คำถามของคุณซับซ้อน :)
PRR

0

ฉันรู้ว่ามีบางคำตอบอื่น ๆ ที่นี่ แต่ไม่มีของพวกเขาจะไม่เพียงพอที่สมบูรณ์รหัสต่อไปนี้จะสร้างไดเรกทอรี (ถ้าไม่ได้อยู่แล้ว) และจากนั้นคัดลอกไฟล์

// using System.IO;

// for ex. if you want to copy files from D:\A\ to D:\B\
foreach (var f in Directory.GetFiles(@"D:\A\", "*.*", SearchOption.AllDirectories))
{
    var fi =  new FileInfo(f);
    var di = new DirectoryInfo(fi.DirectoryName);

    // you can filter files here
    if (fi.Name.Contains("FILTER")
    {
        if (!Directory.Exists(di.FullName.Replace("A", "B"))
        {                       
            Directory.CreateDirectory(di.FullName.Replace("A", "B"));           
            File.Copy(fi.FullName, fi.FullName.Replace("A", "B"));
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.