ฉันจะสร้างไฟล์ชั่วคราวที่มีนามสกุลเฉพาะกับ. NET ได้อย่างไร


277

ฉันต้องการสร้างไฟล์ชั่วคราวที่ไม่ซ้ำกับนามสกุล. csv

สิ่งที่ฉันทำตอนนี้คือ

string filename = System.IO.Path.GetTempFileName().Replace(".tmp", ".csv");

อย่างไรก็ตามสิ่งนี้ไม่รับประกันว่าไฟล์. csv ของฉันจะไม่ซ้ำกัน

ฉันรู้ว่าโอกาสที่ฉันจะได้รับการชนนั้นต่ำมาก (โดยเฉพาะถ้าคุณพิจารณาว่าฉันไม่ลบไฟล์. tmp) แต่รหัสนี้ดูไม่ดีสำหรับฉัน

แน่นอนว่าฉันสามารถสร้างชื่อไฟล์แบบสุ่มด้วยตนเองได้จนกว่าฉันจะพบชื่อที่ไม่ซ้ำกัน (ซึ่งไม่น่าจะมีปัญหา) แต่ฉันอยากรู้ว่าคนอื่น ๆ พบวิธีที่ดีในการจัดการกับปัญหานี้หรือไม่


4
คำเตือนบางอย่างเกี่ยวกับ GetTempFileName วิธี GetTempFileName จะเพิ่ม IOException หากมีการใช้เพื่อสร้างไฟล์มากกว่า 65535 ไฟล์โดยไม่ต้องลบไฟล์ชั่วคราวก่อนหน้านี้ กระบวนการ GetTempFileName วิธีนี้จะเพิ่ม IOException ถ้าไม่มีชื่อแฟ้มชั่วคราวที่ไม่ซ้ำกัน ในการแก้ไขข้อผิดพลาดนี้ให้ลบไฟล์ชั่วคราวที่ไม่จำเป็นทั้งหมด
Max Hodges

2
ไฟล์ชั่วคราวส่วนใหญ่จะใช้สำหรับชุดเงื่อนไขเฉพาะ หากนามสกุลไฟล์มีความสำคัญฉันสงสัยว่าบางทีการใช้ GetTempFileName ไม่ใช่โซลูชันการเขียน ฉันรู้ว่ามันใช้เวลานานมาก แต่ถ้าคุณบอกเราเกี่ยวกับบริบทและความต้องการไฟล์เหล่านี้เราอาจสามารถแนะนำวิธีการที่ดีกว่าโดยสิ้นเชิง เพิ่มเติมได้ที่นี่: support.microsoft.com/kb/92635?wa=wsignin1.0
Max Hodges

1
โปรดจำไว้ว่าGetTempFileName() สร้างไฟล์ใหม่ทุกครั้งที่คุณเรียกมัน - หากคุณเปลี่ยนสตริงเป็นอย่างอื่นทันทีคุณเพิ่งสร้างไฟล์ศูนย์ไบต์ใหม่ในไดเรกทอรีชั่วคราวของคุณ (และอย่างที่คนอื่น ๆ จดไว้สิ่งนี้จะทำให้ล้มเหลวในที่สุดเมื่อคุณกดไฟล์ 65535 ใน ... ) - - เพื่อหลีกเลี่ยงปัญหานี้ตรวจสอบให้แน่ใจว่าได้ลบไฟล์ใด ๆ ที่คุณสร้างในโฟลเดอร์นั้น (รวมถึงไฟล์ที่ส่งคืนโดยGetTempFileName()ควรอยู่ในบล็อกสุดท้าย)
BrainSlugs83

คำตอบ:


354

รับประกันว่าจะไม่ซ้ำกัน (สถิติ):

string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".csv"; 

(เพื่ออ้างอิงจากบทความ wiki เกี่ยวกับความน่าจะเป็นของการชน:

... ความเสี่ยงต่อการถูกชนอุกกาบาตประจำปีประมาณว่าเป็นโอกาสครั้งเดียวใน 17 พันล้าน [19] นั่นหมายถึงความน่าจะเป็นคือประมาณ 0.00000000006 (6 × 10−11) เทียบเท่ากับอัตราต่อรองที่สร้างไม่กี่สิบ ล้านล้าน UUIDs ในหนึ่งปีและมีหนึ่งซ้ำ กล่าวอีกนัยหนึ่งหลังจากสร้าง 1 พันล้าน UUID ทุก ๆ วินาทีในอีก 100 ปีข้างหน้าความน่าจะเป็นที่จะสร้างซ้ำเพียงครั้งเดียวจะอยู่ที่ประมาณ 50% ความน่าจะเป็นของสำเนาที่ซ้ำกันจะอยู่ที่ประมาณ 50% ถ้าทุกคนในโลกเป็นเจ้าของ UUID 600 ล้าน

แก้ไข: โปรดดูความเห็นของ JaredPar ด้วย


29
แต่ไม่รับประกันว่าจะอยู่ในตำแหน่งที่เขียน
JaredPar

33
และพวกเขาไม่ได้รับประกันว่าจะไม่ซ้ำกันเลยเพียงแค่ไม่น่าเป็นสถิติ
paxdiablo

30
@Pax: คุณมี chnace มากกว่าในการชนะลอตเตอรี 1,000 ครั้งติดต่อกันแทนที่จะสร้าง gubactic สองครั้ง นั่นเพียงพอที่ไม่ซ้ำกันผมคิดว่า ...
มิทช์ข้าวสาลี

11
@ เหตุผลที่ไม่เหมือนใครก็เพราะเป็นไปได้ที่ฉันจะสร้างไฟล์ที่มีชื่อเดียวกันในพา ธ เดียวกัน GUID ในขณะที่รับประกันว่าจะไม่เหมือนใครก็สามารถคาดเดาได้ซึ่งหมายความว่าได้รับข้อมูลที่เพียงพอฉันสามารถเดา guids ชุดถัดไปที่สร้างขึ้นโดยกล่องของคุณ
JaredPar

207
ผู้คนที่ดีพยายามอย่างหนักเพื่อป้องกันไม่ให้หัวเมฆ วิธีการคือ: สร้างชื่อไฟล์สุ่มจากนั้นสร้างมันหากไม่มีอยู่ ดังนั้นเพียงแค่ช่วยให้เขารหัสที่ดี การพูดคุยทั้งหมดนี้เกี่ยวกับเครื่องกำเนิดไฟฟ้าแบบหลอกหลอกและตัวเลขที่เป็นเอกลักษณ์ในระดับสากลนั้นไม่จำเป็นเลย
Max Hodges

58

ลองใช้ฟังก์ชั่นนี้ ...

public static string GetTempFilePathWithExtension(string extension) {
  var path = Path.GetTempPath();
  var fileName = Guid.NewGuid().ToString() + extension;
  return Path.Combine(path, fileName);
}

มันจะกลับเส้นทางที่เต็มไปด้วยส่วนขยายที่คุณเลือก

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


4
บางที Path.ChangeExtension () น่าจะหรูหรากว่า Guid.NewGuid (). ToString () + ส่วนขยาย
Ohad Schneider

@ohadsc - แน่นอนGuid.NewGuid().ToString() + extensionไม่ถูกต้องก็ควรเป็นGuid.NewGuid().ToString() + "." + extension
Stephen Swensen

4
ฉันคิดว่าขึ้นอยู่กับสัญญาของวิธีการ (ไม่ว่าจะเป็นที่คาดหวัง.txtหรือtxt) แต่เนื่องจากChangeExtensionจัดการทั้งสองกรณีก็ไม่สามารถทำร้าย
Ohad Schneider

1
เรียกว่าคำต่อท้ายแทนส่วนขยายและทุกคนมีความสุขฉันเดา
Chiel ten Brinke

46
public static string GetTempFileName(string extension)
{
  int attempt = 0;
  while (true)
  {
    string fileName = Path.GetRandomFileName();
    fileName = Path.ChangeExtension(fileName, extension);
    fileName = Path.Combine(Path.GetTempPath(), fileName);

    try
    {
      using (new FileStream(fileName, FileMode.CreateNew)) { }
      return fileName;
    }
    catch (IOException ex)
    {
      if (++attempt == 10)
        throw new IOException("No unique temporary file name is available.", ex);
    }
  }
}

หมายเหตุ: มันใช้งานได้เหมือน Path.GetTempFileName ไฟล์ว่างถูกสร้างขึ้นเพื่อจองชื่อไฟล์ มันทำให้ 10 ครั้งในกรณีของการชนที่สร้างขึ้นโดย Path.GetRandomFileName ();


โปรดทราบว่าPath.GetRandomFileName()จริง ๆ แล้วสร้างไฟล์ zero-byte บนดิสก์และส่งคืนพา ธ เต็มของไฟล์นั้น คุณไม่ได้ใช้ไฟล์นี้มีเพียงชื่อในการเปลี่ยนนามสกุล ดังนั้นหากคุณไม่แน่ใจว่าคุณกำลังลบไฟล์ชั่วคราวเหล่านี้หลังจากที่มีการเรียกใช้ฟังก์ชันนี้ไปแล้ว 65535 ไฟล์มันจะเริ่มล้มเหลว
Vladimir Baranov

7
คุณได้ผสมและGetTempFileName() สร้างไฟล์ zero-byte เช่นวิธีการของฉัน แต่ไม่ได้สร้างไฟล์ จากเอกสาร:> ซึ่งแตกต่างจาก GetTempFileName, GetRandomFileName ไม่ได้สร้างไฟล์ ลิงก์ของคุณชี้ไปที่หน้าผิด GetRandomFileName()GetTempFileName()GetRandomFileName()
Maxence

19

นอกจากนี้คุณยังสามารถผลัดกันใช้System.CodeDom.Compiler.TempFileCollection

string tempDirectory = @"c:\\temp";
TempFileCollection coll = new TempFileCollection(tempDirectory, true);
string filename = coll.AddExtension("txt", true);
File.WriteAllText(Path.Combine(tempDirectory,filename),"Hello World");

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


10

ทำไมไม่ตรวจสอบว่ามีไฟล์อยู่หรือไม่

string fileName;
do
{
    fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".csv";
} while (System.IO.File.Exists(fileName));

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

4
... แล้วคุณปลอดภัยอยู่กับโปรแกรมของคุณเองอาจจะ แต่ไม่ได้มีกระบวนการอื่น ๆ ที่เขียนไฟล์บนปลายทางเดียวกันกับที่แน่นอน ...
Koen

@ JaredPar และความสามารถในการเกิดเหตุการณ์นี้คืออะไร?
Migol

2
@Migol มันต่ำมากและโดยนิยามเงื่อนไขพิเศษ อืมแน่นอนว่ามีข้อยกเว้นอะไรที่ออกแบบมาเพื่อใช้
Cody Gray

3
@CodyGray โอกาสในการปะทะ guid คือ 1/2 ^ 128 โอกาสที่มันจะเกิดขึ้น 2 ครั้งคือ 1/2 ^ 256 เป็นต้นอย่ารำคาญ!
Migol

9

เอกสาร MSDN สำหรับGetTempFileNameของC ++ จะกล่าวถึงข้อกังวลของคุณและตอบคำถาม:

GetTempFileName จะไม่สามารถรับประกันได้ว่าชื่อไฟล์ที่เป็นเอกลักษณ์

มีการใช้เฉพาะพารามิเตอร์ 16 บิตที่ต่ำกว่าของ uUnique สิ่งนี้ จำกัด GetTempFileName สูงสุด 65,535 ชื่อไฟล์ที่ไม่ซ้ำกันถ้าพารามิเตอร์ lpPathName และ lpPrefixString ยังคงเหมือนเดิม

เนื่องจากอัลกอริทึมที่ใช้ในการสร้างชื่อไฟล์ GetTempFileName สามารถทำงานได้ไม่ดีเมื่อสร้างไฟล์จำนวนมากที่มีคำนำหน้าเหมือนกัน ในกรณีเช่นนี้ก็ขอแนะนำว่าคุณสร้างชื่อไฟล์ที่ไม่ซ้ำกันขึ้นอยู่กับ guid ของ


2
กระบวนการ GetTempFileName วิธีนี้จะเพิ่ม IOException ถ้ามันถูกใช้เพื่อสร้างมากกว่า 65535 ไฟล์โดยไม่ต้องลบไฟล์ชั่วคราวก่อนหน้า กระบวนการ GetTempFileName วิธีนี้จะเพิ่ม IOException ถ้าไม่มีชื่อแฟ้มชั่วคราวที่ไม่ซ้ำกัน ในการแก้ไขข้อผิดพลาดนี้ให้ลบไฟล์ชั่วคราวที่ไม่จำเป็นทั้งหมด
Max Hodges

นั่นคือคำพูดที่ไม่สมบูรณ์ คำพูดที่เกี่ยวข้อง: " ถ้า uUnique ไม่ใช่ศูนย์คุณต้องสร้างไฟล์ด้วยตัวเองมีเพียงชื่อไฟล์ที่ถูกสร้างขึ้นเพราะ GetTempFileName ไม่สามารถรับประกันได้ว่าชื่อไฟล์จะไม่ซ้ำกัน" ถ้าคุณเรียกมันว่าทุกคนคุยกันที่นี่ uUnique จะเป็นศูนย์
jnm2

6

เกี่ยวกับ:

Path.Combine(Path.GetTempPath(), DateTime.Now.Ticks.ToString() + "_" + Guid.NewGuid().ToString() + ".csv")

เป็นไปไม่ได้อย่างมากที่คอมพิวเตอร์จะสร้าง Guid เดียวกันในเวลาเดียวกันทันที จุดอ่อนเดียวที่ฉันเห็นที่นี่คือผลกระทบต่อประสิทธิภาพ DateTime ตอนนี้จะเพิ่มปุ่มเพิ่ม


5

คุณยังสามารถทำสิ่งต่อไปนี้

string filename = Path.ChangeExtension(Path.GetTempFileName(), ".csv");

และสิ่งนี้ยังทำงานได้ตามที่คาดไว้

string filename = Path.ChangeExtension(Path.GetTempPath() + Guid.NewGuid().ToString(), ".csv");

2
นี้จะล้มเหลวถ้ามี temp.csv ไฟล์และคุณสร้าง temp.tmp แล้วเปลี่ยนนามสกุลเป็น CSV
เดวิด

ไม่มันจะไม่ ... GetTempFileName () สร้างชื่อไฟล์ที่ไม่ซ้ำกัน ... เกินขีด จำกัด 32K ณ จุดที่คุณต้องการลบไฟล์บางไฟล์ แต่ฉันคิดว่าโซลูชันของฉันนั้นถูกต้อง มันผิดถ้าฉันต้องส่งพา ธ ของไฟล์ไปยัง ChangeExtension ที่ไม่ได้รับประกันว่าจะไม่ซ้ำกัน แต่นั่นไม่ใช่สิ่งที่โซลูชันของฉันทำ
Michael Prewecki

11
GetTempFileName รับประกันว่าเส้นทางที่ส่งคืนจะไม่ซ้ำกัน ไม่ว่าเส้นทางที่ส่งคืน + ".csv" จะไม่ซ้ำกัน การเปลี่ยนนามสกุลด้วยวิธีนี้อาจล้มเหลวตามที่เดวิดพูด
Marcus Griep

5
GetTempFileName สร้างไฟล์ดังนั้นตัวอย่างแรกของคุณคือทรัพยากรรั่วไหล
Gary McGill

3

ในความคิดของฉันคำตอบส่วนใหญ่เสนอให้ที่นี่ว่าย่อยดีที่สุด คนที่ใกล้เข้ามามากที่สุดคือคนแรกที่ Brann เสนอ

ชื่อไฟล์ชั่วคราวจะต้องเป็น

  • เป็นเอกลักษณ์
  • ปราศจากความขัดแย้ง (ยังไม่มีอยู่)
  • Atomic (การสร้างชื่อและไฟล์ในการดำเนินการเดียวกัน)
  • เดายาก

เนื่องจากข้อกำหนดเหล่านี้จึงไม่ใช่แนวคิดที่จะตั้งโปรแกรมสัตว์ร้ายด้วยตัวคุณเอง คนที่ฉลาดในการเขียนไลบรารี IO กังวลเกี่ยวกับสิ่งต่าง ๆ เช่นการล็อก (ถ้าจำเป็น) เป็นต้นดังนั้นฉันไม่เห็นความจำเป็นในการเขียน System.IO.Path.GetTempFileName ()

แม้ว่ามันจะดูเงอะงะ แต่ก็ควรทำงาน:

//Note that this already *creates* the file
string filename1 = System.IO.Path.GetTempFileName()
// Rename and move
filename = filename.Replace(".tmp", ".csv");
File.Move(filename1 , filename);

2
แต่นั่นไม่ใช่ความขัดแย้ง 'csv' อาจมีอยู่แล้วและถูกเขียนทับ
xvan

3
File.Moveเพิ่มIOExceptionว่าไฟล์ปลายทางมีอยู่แล้ว msdn.microsoft.com/en-us/library/…
joshuanapoli

2

สิ่งนี้อาจมีประโยชน์สำหรับคุณ ... มันคือการสร้างอุณหภูมิ โฟลเดอร์และส่งคืนเป็นสตริงใน VB.NET

แปลงสภาพได้อย่างง่ายดายเป็น C #:

Public Function GetTempDirectory() As String
    Dim mpath As String
    Do
        mpath = System.IO.Path.Combine(System.IO.Path.GetTempPath, System.IO.Path.GetRandomFileName)
    Loop While System.IO.Directory.Exists(mpath) Or System.IO.File.Exists(mpath)
    System.IO.Directory.CreateDirectory(mpath)
    Return mpath
End Function

2

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

private string GetTempFile(string fileExtension)
{
  string temp = System.IO.Path.GetTempPath();
  string res = string.Empty;
  while (true) {
    res = string.Format("{0}.{1}", Guid.NewGuid().ToString(), fileExtension);
    res = System.IO.Path.Combine(temp, res);
    if (!System.IO.File.Exists(res)) {
      try {
        System.IO.FileStream s = System.IO.File.Create(res);
        s.Close();
        break;
      }
      catch (Exception) {

      }
    }
  }
  return res;
} // GetTempFile

2

ฟังก์ชั่นง่าย ๆ ใน C #:

public static string GetTempFileName(string extension = "csv")
{
    return Path.ChangeExtension(Path.GetTempFileName(), extension);
}

GetTempFileName () สร้างไฟล์ชั่วคราวในโฟลเดอร์ temp ดังนั้นคุณจะมีไฟล์ชั่วคราวสองไฟล์สร้างขึ้นซึ่งหนึ่งในนั้นจะรั่วไหล
evgenybf

1

จากคำตอบที่ฉันพบจากอินเทอร์เน็ตฉันมาที่รหัสของฉันดังนี้

public static string GetTemporaryFileName()
{       
    string tempFilePath = Path.Combine(Path.GetTempPath(), "SnapshotTemp");
    Directory.Delete(tempFilePath, true);
    Directory.CreateDirectory(tempFilePath);
    return Path.Combine(tempFilePath, DateTime.Now.ToString("MMddHHmm") + "-" + Guid.NewGuid().ToString() + ".png");
}

และในฐานะตำรา C # โดย Jay Hilyard, Stephen Teilhet ชี้ว่าในการใช้ไฟล์ชั่วคราวในใบสมัครของคุณ :

  • คุณควรใช้ไฟล์ชั่วคราวทุกครั้งที่คุณต้องการจัดเก็บข้อมูลชั่วคราวเพื่อการสืบค้นในภายหลัง

  • สิ่งหนึ่งที่คุณต้องจำไว้คือการลบไฟล์ชั่วคราวนี้ก่อนที่แอปพลิเคชันที่สร้างขึ้นจะถูกยกเลิก

  • หากไม่ถูกลบมันจะยังคงอยู่ในไดเรกทอรีชั่วคราวของผู้ใช้จนกว่าผู้ใช้จะลบมันด้วยตนเอง


1

ฉันผสมคำตอบ@Maxenceและ@Mitch Wheatไว้ในใจฉันต้องการความหมายของวิธี GetTempFileName (ชื่อไฟล์เป็นชื่อของไฟล์ใหม่ที่สร้างขึ้น) เพิ่มส่วนขยายที่ต้องการ

string GetNewTempFile(string extension)
{
    if (!extension.StartWith(".")) extension="." + extension;
    string fileName;
    bool bCollisions = false;
    do {
        fileName = Path.Combine(System.IO.Path.GetTempPath(), Guid.NewGuid().ToString() + extension);
        try
        {
            using (new FileStream(fileName, FileMode.CreateNew)) { }
            bCollisions = false;
        }
        catch (IOException)
        {
            bCollisions = true;
        }
    }
    while (bCollisions);
    return fileName;
}

0

นี่คือสิ่งที่ฉันทำ:

string tStamp = String.Format ("{0: yyyyMMdd.HHmmss}", DateTime.Now);
สตริง ProcID = Process.GetCurrentProcess (). Id.ToString ();
สตริง tmpFolder = System.IO.Path.GetTempPath ();
string outFile = tmpFolder + ProcID + "_" + tStamp + ".txt";

ดี: รวมตัวระบุกระบวนการไม่ดี: ไม่รวมตัวระบุเธรด (แม้ว่าคุณจะสามารถเรียกใช้สิ่งนี้ได้ภายในล็อค) ไม่ดี: การประทับเวลามีความละเอียดเพียง 1 วินาที ในหลาย ๆ แอปพลิเคชั่นเป็นเรื่องปกติที่จะสร้างไฟล์จำนวนมากต่อวินาที
andrewf

0

นี่เป็นวิธีที่ง่าย แต่มีประสิทธิภาพในการสร้างชื่อไฟล์ที่เพิ่มขึ้น มันจะดูในปัจจุบันโดยตรง (คุณสามารถชี้ที่อื่น) และค้นหาไฟล์ที่มีฐาน YourApplicationName * .txt (อีกครั้งคุณสามารถเปลี่ยนได้อย่างง่ายดาย) มันจะเริ่มต้นที่ 0000 เพื่อให้ชื่อไฟล์แรกคือ YourApplicationName0000.txt ถ้าด้วยเหตุผลบางอย่างมีชื่อไฟล์ที่มีขยะระหว่าง (หมายถึงตัวเลขไม่) ส่วนด้านซ้ายและขวาไฟล์เหล่านั้นจะถูกละเว้นโดยอาศัยการเรียกใช้ tryparse

    public static string CreateNewOutPutFile()
    {
        const string RemoveLeft = "YourApplicationName";
        const string RemoveRight = ".txt";
        const string searchString = RemoveLeft + "*" + RemoveRight;
        const string numberSpecifier = "0000";

        int maxTempNdx = -1;

        string fileName;
        string [] Files = Directory.GetFiles(Directory.GetCurrentDirectory(), searchString);
        foreach( string file in Files)
        {
            fileName = Path.GetFileName(file);
            string stripped = fileName.Remove(fileName.Length - RemoveRight.Length, RemoveRight.Length).Remove(0, RemoveLeft.Length);
            if( int.TryParse(stripped,out int current) )
            {
                if (current > maxTempNdx)
                    maxTempNdx = current;
            }
        }
        maxTempNdx++;
        fileName = RemoveLeft + maxTempNdx.ToString(numberSpecifier) + RemoveRight;
        File.CreateText(fileName); // optional
        return fileName;
    }

-2

ฉันคิดว่าคุณควรลองสิ่งนี้:

string path = Path.GetRandomFileName();
path = Path.Combine(@"c:\temp", path);
path = Path.ChangeExtension(path, ".tmp");
File.Create(path);

มันสร้างชื่อไฟล์ที่ไม่ซ้ำกันและสร้างไฟล์ที่มีชื่อไฟล์ที่ตำแหน่งที่ระบุ


3
วิธีนี้มีปัญหามากมาย คุณไม่สามารถรวม C: \ temp กับพา ธ สัมบูรณ์ได้ c: \ temp อาจไม่สามารถเขียนได้และไม่รับประกันว่าไฟล์รุ่น. tmp นั้นจะไม่ซ้ำกัน
Mark Lakata
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.