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


202

ฉันมีรหัสที่นี่ที่แบ่งหากไดเรกทอรีไม่อยู่:

System.IO.File.WriteAllText(filePath, content);

ในหนึ่งบรรทัด (หรือไม่กี่บรรทัด) เป็นไปได้หรือไม่ที่จะตรวจสอบว่าไดเรกทอรีที่นำไปสู่ไฟล์ใหม่ไม่มีอยู่หรือไม่และหากไม่ต้องการสร้างมันก่อนที่จะสร้างไฟล์ใหม่?

ฉันใช้. NET 3.5



@TimSchmelter "เป็นไปได้ที่ซ้ำกัน" เป็นวิธีการล้าง - เพื่อปิดคำถามที่คล้ายกันและเก็บไว้กับคำตอบที่ดีที่สุด วันที่ไม่จำเป็น ดูmeta.stackexchange.com/questions/147643/หากคุณยอมรับว่าต้องการการชี้แจงโปรดลงคะแนนในmeta.stackexchange.com/questions/281980/…
Michael Freidgeim

คำตอบ:


394

เพื่อสร้าง

(new FileInfo(filePath)).Directory.Create() ก่อนที่จะเขียนลงไฟล์

.... หรือถ้ามีอยู่ให้สร้าง (ไม่ทำอะไรเลย)

System.IO.FileInfo file = new System.IO.FileInfo(filePath);
file.Directory.Create(); // If the directory already exists, this method does nothing.
System.IO.File.WriteAllText(file.FullName, content);

5
โซลูชันที่หรูหราเนื่องจากสามารถจัดการกับสถานการณ์ที่ต้องมีการสร้างโฟลเดอร์ซ้อนกัน
Denny Jacob

ขอบคุณ! ฉันเห็นstackoverflow.com/questions/9065598แต่ฉันต้องการเริ่มต้นด้วยพา ธ สัมบูรณ์ไปยังไฟล์และไม่ต้องการจัดการกับการแยกพา ธ ตอนนี้ฉันรู้ว่าคุณสามารถเข้าถึงไดเรกทอรีจากอินสแตนซ์ FileInfo
โยฮันน์

มีวิธี async ในการทำเช่นนี้หรือไม่?
โจฟิลลิป

1
Task.Run(() => );ฉันคิดว่าคุณสามารถทำมันได้ด้วย
Don

107

คุณสามารถใช้รหัสต่อไปนี้

  DirectoryInfo di = Directory.CreateDirectory(path);

41
Directory.CreateDirectoryทำสิ่งที่คุณต้องการ: มันจะสร้างไดเรกทอรีหากยังไม่มีอยู่ ไม่จำเป็นต้องทำการตรวจสอบอย่างชัดเจนครั้งแรกไม่ได้
เปาโล Moretti

13
โยน IOException ถ้าpathเป็นไฟล์ไม่ใช่ไดเร็กตอรี่ msdn.microsoft.com/en-us/library/54a0at6s(v=vs.110).aspx
scaryman

34

ดังที่ @hitec กล่าวว่าคุณต้องแน่ใจว่าคุณมีสิทธิ์ที่ถูกต้องหากคุณคุณสามารถใช้บรรทัดนี้เพื่อให้แน่ใจว่ามีไดเรกทอรีอยู่:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))


0

วิธีที่สวยงามในการย้ายไฟล์ของคุณไปยังไดเรกทอรีที่ไม่มีอยู่คือการสร้างส่วนขยายต่อไปนี้ไปยังคลาส FileInfo ดั้งเดิม:

public static class FileInfoExtension
{
    //second parameter is need to avoid collision with native MoveTo
    public static void MoveTo(this FileInfo file, string destination, bool autoCreateDirectory) { 

        if (autoCreateDirectory)
        {
            var destinationDirectory = new DirectoryInfo(Path.GetDirectoryName(destination));

            if (!destinationDirectory.Exists)
                destinationDirectory.Create();
        }

        file.MoveTo(destination);
    }
}

จากนั้นใช้ส่วนขยาย MoveTo ใหม่:

 using <namespace of FileInfoExtension>;
 ...
 new FileInfo("some path")
     .MoveTo("target path",true);

ตรวจสอบวิธีการขยายเอกสาร


-1

คุณสามารถใช้File.Existsเพื่อตรวจสอบว่ามีไฟล์อยู่และสร้างโดยใช้File.Createหากต้องการ ตรวจสอบให้แน่ใจว่าคุณตรวจสอบว่าคุณมีสิทธิ์เข้าถึงเพื่อสร้างไฟล์ที่ตำแหน่งนั้นหรือไม่

เมื่อคุณมั่นใจว่ามีไฟล์อยู่คุณสามารถเขียนลงไฟล์ได้อย่างปลอดภัย แม้ว่าจะเป็นข้อควรระวัง แต่คุณควรใส่โค้ดในลอง ... catch block และ catch สำหรับข้อยกเว้นที่ฟังก์ชันนั้นมีแนวโน้มที่จะเพิ่มขึ้นหากสิ่งต่าง ๆ ไม่เป็นไปตามที่วางแผนไว้

ข้อมูลเพิ่มเติมสำหรับแนวคิดไฟล์ I / O พื้นฐาน


เริ่มแรกฉันอ่านคำถามของคุณผิดที่คุณต้องการเขียนไปยังไฟล์ที่อาจไม่มีอยู่จริง แนวคิดนั้นเหมือนกันสำหรับ File และ Directory IO แม้ว่า
hitec

-2

var filePath = context.Server.MapPath(Convert.ToString(ConfigurationManager.AppSettings["ErrorLogFile"]));

var file = new FileInfo(filePath);

file.Directory.Create(); หากไดเรกทอรีมีอยู่แล้ววิธีนี้จะไม่ทำอะไรเลย

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

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