หากไม่มีโฟลเดอร์ให้สร้างขึ้น


720

ฉันใช้การควบคุม FileUploader ในแอปพลิเคชันของฉัน ฉันต้องการบันทึกไฟล์ในโฟลเดอร์ที่ระบุ ตอนนี้ฉันต้องการถ้าโฟลเดอร์นี้ไม่มีอยู่ให้สร้างมันขึ้นมาก่อนแล้วจึงบันทึกไฟล์ของฉันไปที่โฟลเดอร์นี้ หากโฟลเดอร์มีอยู่แล้วให้บันทึกไฟล์ไว้ในนั้น

ฉันจะทำสิ่งนี้ได้อย่างไร


@JoeBlow - Ha - ควรระบุคำตอบที่ไม่ถูกต้อง - ตอนนี้หน้าเว็บมีความสับสนมากยิ่งขึ้น (เขาเปลี่ยนคำตอบที่ยอมรับหรือไม่หรือเขาไม่ได้ OMG!) ;-)
Bartosz

ฉันลงเอยที่นี่พร้อมกับมองหาสิ่งอื่น ๆ แต่มันวิเศษมากที่คนจำนวนมากกำลังต่อสู้เพื่อแย้งกันด้วยเรื่องราวเดียวกันในเวอร์ชั่นของตัวเอง Microsoft เขียน. NET Framework และ MSDN พฤติกรรมที่ถูกต้องนั้นได้รับการยอมรับจากผู้ใช้งานอื่น ๆ เช่นโมโนหรือไม่นั้นไม่เกี่ยวข้องกับความถูกต้องของพฤติกรรมที่อธิบายไว้ใน MSDN โอ้และโมโนก็ทำสิ่งที่ถูกต้องเช่นกัน
monkey0506

คำตอบ:


1239

อย่างที่คนอื่นพูดใช้ System.IO.Directory.CreateDirectory

แต่คุณไม่จำเป็นต้องตรวจสอบว่ามันมีอยู่ก่อน จากเอกสาร

ไดเร็กทอรีใด ๆ และทั้งหมดที่ระบุในพา ธ ถูกสร้างขึ้นยกเว้นว่ามีอยู่แล้วหรือมีบางส่วนของพา ธ ไม่ถูกต้อง หากไดเรกทอรีมีอยู่แล้ววิธีนี้จะไม่สร้างไดเรกทอรีใหม่ แต่จะส่งคืนวัตถุ DirectoryInfo สำหรับไดเรกทอรีที่มีอยู่



25
และยัง Microsoft ตรงกันข้ามตัวอย่างรหัสตัวเองโดยตรวจสอบว่าไดเรกทอรีที่มีอยู่ก่อน ...
eCoE

1
ดังนั้นเราต้องตรวจสอบว่ามันมีอยู่หรือไม่? หากเราตรวจสอบและจากนั้นตรวจสอบวิธีการ CreateDirectory อีกครั้งเราจะตรวจสอบสองครั้ง ... และการทำงานของระบบไฟล์ AFAIK มีราคาแพง
Giox

3
@Muflix เช่นนี้ - สร้างไฟล์เช่น "FILENAME" ในไดเรกทอรี แต่อย่าให้ส่วนขยายใด ๆ จากนั้นลองเรียก Directory.Exists ("FILENAME") จะคืนค่าเท็จเนื่องจากควรไม่มีไดเรกทอรีดังกล่าว ตอนนี้ถ้าคุณเรียก CreateDirectory ("FILENAME") มันจะล้มเหลวอย่างน่าสังเวชอย่างที่ควรจะเป็นเพราะมี "บางอย่าง" ที่มีชื่อนั้นอยู่แล้ว หวังว่ามันสมเหตุสมผล
OtávioDécio

1
ไม่ถูกต้อง! ฉันต้องตรวจสอบว่ามีโฟลเดอร์อยู่หรือไม่ ฉันเพิ่งระบุว่าวิธีนี้มีปัญหาร้ายแรง หากคุณไม่ได้ตรวจสอบว่ามีโฟลเดอร์อยู่หรือไม่หมายเลขอ้างอิงของโฟลเดอร์จะรั่วถ้าคุณไม่ปล่อยมันโดยเฉพาะ เราใช้ตัวอย่างนี้ในแอปพลิเคชันที่ประมวลผลโฟลเดอร์นับล้าน ทุกครั้งที่เรียกใช้เมธอดนี้แอปพลิเคชันจะคงการจัดการไฟล์ไว้ในไดเรกทอรี หลังจากผ่านไปหลายชั่วโมงเครือข่ายองค์กร NAS มีการจัดการไฟล์หลายล้านไฟล์เปิดอยู่ในโฟลเดอร์ การอัปเดตเพื่อรวมการตรวจสอบฟรีคือจุดจับ
soddoff Baldrick

356

ใช้รหัสด้านล่างตามhttp://forums.asp.net/p/1226236/2209871.aspx :

string subPath ="ImagesPath"; // your code goes here

bool exists = System.IO.Directory.Exists(Server.MapPath(subPath));

if(!exists)
    System.IO.Directory.CreateDirectory(Server.MapPath(subPath));

41
ทำไมไม่: ถ้า (! Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check);
Dayan

158
ไม่จำเป็นต้องตรวจสอบว่ามีโฟลเดอร์อยู่หรือไม่ อ่านคู่มืออย่างระมัดระวัง
bazzilic

30
การตรวจสอบและสร้างไม่ใช่อะตอม รหัสข้างต้นมีกลิ่นมีสภาพการแข่งขัน คุณควรสร้างไดเรกทอรีโดยไม่มีเงื่อนไขและตรวจจับFileExistsข้อยกเว้น (หรืออะไรก็ตามที่เทียบเท่ากับ C #) ในกรณีที่ฟังก์ชั่นถูกออกแบบมาให้ใช้งานได้
Jo So

6
เช่นเดียวกับคนอื่น ๆ ได้ชี้ให้เห็นว่าไม่จำเป็นต้องโทรไปหาExistsและมันจะสร้างเงื่อนไขความล้มเหลวใหม่
Ed S.

3
@MartinSmith: จากนั้นเพียงสร้างไดเรกทอรี อย่าตรวจสอบการมีอยู่ก่อน ที่ไม่เพียงสั้น นอกจากนี้ยังไม่ให้การแสดงผลที่ผิดพลาดของสิ่งที่ API ของSystem.IO.Directory.CreateDirectoryมี (และมันเร็วกว่า แต่อาจไม่สำคัญ)
โจดังนั้น

223

แค่เขียนบรรทัดนี้:

System.IO.Directory.CreateDirectory("my folder");
  • ถ้าโฟลเดอร์ไม่ได้อยู่ ๆก็จะถูกสร้างขึ้น
  • ถ้าโฟลเดอร์ที่มีอยู่แล้วสายจะถูกละเลย

การอ้างอิง: บทความเกี่ยวกับ Directory.CreateDirectory ที่ MSDN

แน่นอนคุณสามารถเขียนusing System.IO;ที่ด้านบนของไฟล์ต้นฉบับแล้วเขียนDirectory.CreateDirectory("my folder");ทุกครั้งที่คุณต้องการสร้างโฟลเดอร์


28

Directory.CreateDirectory อธิบายถึงวิธีการลองและสร้าง FilePath หากไม่มีอยู่

Directory.Existsอธิบายวิธีตรวจสอบว่ามี FilePath อยู่หรือไม่ อย่างไรก็ตามคุณไม่ต้องการสิ่งนี้เนื่องจาก CreateDirectory จะตรวจสอบให้คุณ


@Tavousi ฟังก์ชั่นนี้ให้โดย jeroenh จะเป็นการเริ่มต้นที่ดี;)
Allan Chua

ไม่มีลิงก์เอกสารของ msdn ที่ดูเหมือนว่าจะใช้งานได้ในขณะนี้แม้ผ่านการค้นหา
msdn

ลิงก์ใช้ได้แล้วตอนนี้
Anand

สิ่งนี้ช่วยให้สภาพการแข่งขันดูคำตอบที่ยอมรับได้
ComFreek

27

คุณสามารถสร้างเส้นทางได้หากยังไม่มีวิธีดังต่อไปนี้:

using System.IO;

private void CreateIfMissing(string path)
{
  bool folderExists = Directory.Exists(Server.MapPath(path));
  if (!folderExists)
    Directory.CreateDirectory(Server.MapPath(path));
}

6
if (!folderExists)ไม่จำเป็นต้องตรวจสอบ
bazzilic

8
@bazzilic ใช่ แต่มันแสดงให้เห็นเจตนา ฉันไม่ต้องเดา (หรือรู้แน่) ว่า API จัดการกับเรื่องนี้อย่างไร ทุกคนที่อ่านรหัสนี้จะรู้ได้ว่าจะเกิดอะไรขึ้น
Dennis Traub

4
ในสภาพแวดล้อมแบบมัลติเธรด (เช่นสถานะของระบบไฟล์) คุณจะมีทางเลือกในการล็อคหรือลองและจับ ตัวอย่างด้านบนมีเงื่อนไขการแข่งขัน ฟังก์ชันอาจส่งFileExistsข้อยกเว้น (หรืออะไรก็ตามที่เรียกใน C #)
Jo So

9
"มันแสดงให้เห็นเจตนา" - นี่ไม่ใช่เหตุผลที่ดี คุณสามารถเขียนความคิดเห็นในรหัส
Jim Balter

15

วิธีนี้จะสร้างโฟลเดอร์หากไม่มีอยู่และไม่ทำอะไรเลยหากมีอยู่

Directory.CreateDirectory(path);

15

คุณสามารถใช้ข้อลอง / จับข้อและตรวจสอบเพื่อดูว่ามันมีอยู่:

  try
  {
    if (!Directory.Exists(path))
    {
       // Try to create the directory.
       DirectoryInfo di = Directory.CreateDirectory(path);
    }
  }
  catch (IOException ioex)
  {
     Console.WriteLine(ioex.Message);
  }

8
นี่เป็นคำตอบที่ดี แต่ตามเอกสารประกอบของ MSDN "ไดเรกทอรีใด ๆ และทั้งหมดที่ระบุในพา ธ ถูกสร้างขึ้นเว้นแต่ว่ามีอยู่แล้วหรือเว้นแต่บางส่วนของเส้นทางไม่ถูกต้องพารามิเตอร์พา ธ ระบุพา ธ ของไดเรกทอรีไม่ใช่พา ธ ของไฟล์ ถ้าไดเรกทอรีมีอยู่แล้ววิธีนี้จะไม่ทำอะไรเลย " ดังนั้นคุณไม่จำเป็นต้องโทรไปที่ Directory.Exists (path)
เคน

2
เป็นความจริง แต่ก็เป็นสมมติฐานดังนั้นจึงเป็นการดีที่สุดที่จะตรวจสอบมากกว่าที่จะคิดโดยไม่คำนึงถึงสิ่งที่ MSDN พูด ..
MethodMan

6
@DJ KRAZE ฉันเชื่อว่า MSDN เว้นแต่ว่าได้รับการพิสูจน์แล้วว่าผิด คุณแนะนำสิ่งที่ตรงกันข้าม - ละเว้นสิ่งที่ MSDN พูดและเพิ่มการตรวจสอบพิเศษ (ไม่จำเป็น) ลงในรหัสของคุณ คุณวาดเส้นที่ไหน
Polyfun

1
ShellShock ไม่มีที่ไหนที่ฉันจะบอกว่าเพิกเฉย .. นี่เป็นคำพูดที่น่าขำขันฉันกำลังพูดว่ามันดีกว่าที่จะไม่คิดมากกว่าที่จะคิด .. อ่านสิ่งที่ฉันได้กล่าวอีกครั้ง .. ขอบคุณ
เมธอด Man

3
@DJKRAZE ไม่มีใครคิดอะไรเลย มันเขียนเป็นภาษาอังกฤษธรรมดาในคู่มือที่ไม่จำเป็นต้องตรวจสอบ
bazzilic


12
if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}

3
CreateDirectory จัดการตรวจสอบแล้วถ้าไม่มีไดเรกทอรีอยู่
bergmeister

6

รหัสต่อไปนี้เป็นบรรทัดที่ดีที่สุดของรหัสที่ฉันใช้ซึ่งจะสร้างไดเรกทอรีหากไม่มีอยู่

System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/temp/"));

หากไดเรกทอรีมีอยู่แล้ววิธีนี้จะไม่สร้างไดเรกทอรีใหม่ แต่จะส่งคืนวัตถุ DirectoryInfo สำหรับไดเรกทอรีที่มีอยู่ >


CreateDirectory จัดการตรวจสอบแล้วถ้าไม่มีไดเรกทอรีอยู่
bergmeister

@bergmeister ขอบคุณ. ฉันเพิ่งตรวจสอบมันได้ทำการตรวจสอบเงื่อนไขออกจริง ๆ อัพเดท !!
UJS

5

นี่คือคำตอบที่ฉันกำลังมองหา แต่ไม่พบ:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • เส้นทางไปยังโฟลเดอร์ใหม่ที่กำหนด
  • ตัวแปรข้อมูลไดเรกทอรีเพื่อให้คุณสามารถดำเนินการต่อได้ตามที่คุณต้องการ

0

ใช้รหัสด้านล่าง ฉันใช้รหัสนี้เพื่อคัดลอกไฟล์และสร้างโฟลเดอร์ใหม่

string fileToCopy = "filelocation\\file_name.txt";
String server = Environment.UserName;
string newLocation = "C:\\Users\\" + server + "\\Pictures\\Tenders\\file_name.txt";
string folderLocation = "C:\\Users\\" + server + "\\Pictures\\Tenders\\";
bool exists = System.IO.Directory.Exists(folderLocation);

if (!exists)
{
   System.IO.Directory.CreateDirectory(folderLocation);
   if (System.IO.File.Exists(fileToCopy))
   {
     MessageBox.Show("file copied");
     System.IO.File.Copy(fileToCopy, newLocation, true);

   }
   else
   {
      MessageBox.Show("no such files");

   }
}


0

ใช้รหัสนี้หากไม่แสดงโฟลเดอร์ภายใต้โฟลเดอร์รูปภาพหรือโฟลเดอร์อื่น

 string subPath = HttpContext.Current.Server.MapPath(@"~/Images/RequisitionBarCode/");
            bool exists = System.IO.Directory.Exists(subPath);
            if(!exists)
            System.IO.Directory.CreateDirectory(subPath); 
string path = HttpContext.Current.Server.MapPath(@"~/Images/RequisitionBarCode/" + OrderId + ".png");

-1

วิธีแฟนซีคือการขยายFileUploadด้วยวิธีที่คุณต้องการ

เพิ่มสิ่งนี้:

public static class FileUploadExtension
{
    public static void SaveAs(this FileUpload, string destination, bool autoCreateDirectory) { 

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

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

        file.SaveAs(destination);
    }
}

จากนั้นใช้:

FileUpload file;
...
file.SaveAs(path,true);

-3
string root = @"C:\Temp";

string subdir = @"C:\Temp\Mahesh";

// If directory does not exist, create it.

if (!Directory.Exists(root))
{

Directory.CreateDirectory(root);

}

CreateDirectory ยังใช้เพื่อสร้างไดเรกทอรีย่อย สิ่งที่คุณต้องทำคือการระบุเส้นทางของไดเรกทอรีที่ไดเรกทอรีย่อยนี้จะถูกสร้างขึ้นใน. โค้ดต่อไปนี้สร้างไดเรกทอรีย่อย Mahesh C:\Temp directoryใน

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}

-5

ที่ได้มา / รวมจากหลายคำตอบการใช้สำหรับฉันนั้นง่ายเหมือนนี้:

public void Init()
{
    String platypusDir = @"C:\platypus";
    CreateDirectoryIfDoesNotExist(platypusDir);
}

private void CreateDirectoryIfDoesNotExist(string dirName)
{
    System.IO.Directory.CreateDirectory(dirName);
}

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