จะสร้างสตริงที่มีความยาวหนึ่งเพื่อแทรกลงในไฟล์เพื่อให้ตรงตามเกณฑ์ขนาดไฟล์ได้อย่างไร?


114

ฉันมีความต้องการที่จะทดสอบปัญหาการโหลดบางอย่างเกี่ยวกับขนาดไฟล์ ฉันมีแอพพลิเคชั่น windows ที่เขียนด้วย C # ซึ่งจะสร้างไฟล์โดยอัตโนมัติ ฉันรู้ขนาดของแต่ละไฟล์เช่น 100KB และจำนวนไฟล์ที่จะสร้าง สิ่งที่ฉันต้องการความช่วยเหลือคือวิธีสร้างสตริงที่น้อยกว่าหรือเท่ากับขนาดไฟล์ที่ต้องการ

รหัสหลอก:

long fileSizeInKB = (1024 * 100); //100KB
int numberOfFiles = 5;

for(var i = 0; i < numberOfFiles - 1; i++) {
     var dataSize = fileSizeInKB;
     var buffer = new byte[dataSize];
     using (var fs = new FileStream(File, FileMode.Create, FileAccess.Write)) {

     }
}

1
ทำไมคุณต้องสร้างสตริง? เพียงแค่เขียนบัฟเฟอร์ของคุณ
ลาซารัส

สมมติว่าฉันต้องการขยายเพื่อสร้างไฟล์ข้อความ Lorem Ipsum แทนที่จะเป็นแค่ "fs.Write (buffer, 0, (int) fileSizeInKB)"
VajNyiaj

คำตอบ:


347

คุณสามารถใช้ตัวสร้างสำหรับสตริงซึ่งใช้เวลาcharและหลายครั้งที่คุณต้องการให้อักขระนั้นซ้ำ:

string myString = new string('*', 5000);

สิ่งนี้ให้จำนวนดาว 5,000 ดวง - ปรับแต่งตามความต้องการของคุณ


83
+1 บรรพบุรุษของเราทำอะไรก่อน Stack Overflow? เรียบง่ายหวานมาก
Dan Solovay

6
Stack overflow เป็นความสำเร็จด้านเทคโนโลยีสูงสุดสิบอันดับแรกตลอดกาล :- D ว่าใครก็ตามที่เรียนรู้การเขียนโค้ดอย่างมีประสิทธิภาพหากไม่มีมันเราจะไม่มีทางรู้เลย
Ben Akin

2
ฉันอยู่ที่นั่นในสมัยโบราณเหล่านี้และฉันยังไม่รู้สึกว่าเป็นบรรพบุรุษ: D วิธีเดียวที่จะพบไข่มุกเช่นนี้คือการค้นหารหัสและ / หรือรหัสของทีมของคุณและสะสมสิ่งดีๆเมื่อเวลาผ่านไป ตอนนี้เราสามารถแบ่งปันไข่มุกกับทุกคน :)
Andrzej Martyna

13

วิธีที่ง่ายที่สุดคือรหัสต่อไปนี้:

var content = new string('A', fileSizeInKB);

ตอนนี้คุณมีสตริงที่มี A มากเท่าที่ต้องการ

หากต้องการเติมด้วย Lorem Ipsum หรือสตริงการทำซ้ำอื่น ๆ ให้สร้างบางสิ่งเช่นรหัสเทียมต่อไปนี้:

string contentString = "Lorem Ipsum...";
for (int i = 0; i < fileSizeInKB / contentString.Length; i++)
  //write contentString to file

if (fileSizeInKB % contentString.Length > 0)
  // write remaining substring of contentString to file

แก้ไข: หากคุณกำลังบันทึกใน Unicode คุณอาจต้องลดจำนวนไฟล์ลงครึ่งหนึ่งเนื่องจาก unicode ใช้สองไบต์ต่ออักขระถ้าฉันจำไม่ผิด


4
fileSizeInKB ควรเป็น fileSizeInBytes .. หรือ fileSizeInBytes / 2 หากคุณกำลังส่งออก Unicode?
James Gaunt

1
ใช่ฉันใช้ชื่อตัวแปรของตัวอย่างค่าที่กำหนดคือไบต์ดังนั้นชื่อจึงไม่ถูกต้องหรือค่าที่กำหนด
Florian von Spiczak

2

มีหลากหลายวิธีที่คุณสามารถทำได้ หนึ่งคือกรอกไฟล์ด้วยตัวอักษรมากมาย คุณต้องการ 100KB? ไม่มีปัญหา .. 100 * 1024 * 8 = 819200 บิต ถ่านเดียวคือ 16 บิต 819200/16 = 51200 คุณต้องติด 51,200 ตัวอักษรลงในไฟล์ แต่ให้พิจารณาว่าไฟล์อาจมีข้อมูลส่วนหัว / เมตาเพิ่มเติมดังนั้นคุณอาจต้องคำนึงถึงสิ่งนั้นและลดจำนวนตัวอักษรที่จะเขียนลงในไฟล์


0

เพื่อเป็นคำตอบบางส่วนสำหรับคำถามของคุณฉันเพิ่งสร้างแอป WPF แบบพกพาที่สร้างไฟล์ 'ขยะ' เกือบทุกขนาดได้อย่างง่ายดาย: https://github.com/webmooch/FileCreator

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