문제

다운로드 애플리케이션을 작성하고 있으며 파일이 실제로 다운로드하기 전에 파일의 하드 드라이브에서 실내를 Prealloce를 원합니다. "이 드라이브가 가득 차면 일부 파일을 삭제하고 다시 시도하십시오. " 그래서, 나는 그 관점에서, 나는 이것을 썼다.

// Quick, and very dirty
System.IO.File.WriteAllBytes(filename, new byte[f.Length]);

적어도 수백 MB 또는 잠재적으로 GB에 달하는 파일을 다운로드하고 페이지 파일을 완전히 지우고 시스템 메모리를 완전히 죽이지 않으면 Windows를 엄청난 열광에 빠뜨릴 때까지 작동합니다.이런.

그래서 좀 더 깨달음을 얻어 다음 알고리즘을 시작했습니다.

using (FileStream outFile = System.IO.File.Create(filename))
{
    // 4194304 = 4MB; loops from 1 block in so that we leave the loop one 
    // block short
    byte[] buff = new byte[4194304];
    for (int i = buff.Length; i < f.Length; i += buff.Length)
    {
        outFile.Write(buff, 0, buff.Length);
    }
    outFile.Write(buff, 0, f.Length % buff.Length);
}

이것은 잘 작동하며 마지막 솔루션의 심각한 메모리 문제를 겪지 않습니다.하지만 여전히 속도가 느립니다. 특히 오래된 하드웨어에서는 데이터(잠재적으로 GB 상당)를 디스크에 기록하기 때문에 더욱 그렇습니다.

질문은 이것입니다:동일한 작업을 수행하는 더 좋은 방법이 있습니까?실제로 엄청난 양의 데이터를 기록하는 대신 x 크기의 파일을 생성하고 파일 시스템에 공간을 할당하도록 Windows에 지시하는 방법이 있습니까?나는 파일의 데이터를 초기화하는 것에 전혀 관심이 없습니다(내가 사용하는 프로토콜인 bittorrent는 전송하는 파일에 대한 해시를 제공하므로 초기화되지 않은 임의의 데이터에 대한 최악의 경우는 행운의 우연과 파일의 일부를 얻는 것입니다) 맞다).

도움이 되었습니까?

해결책

FileStream.SetLength 당신이 원하는 것입니다.구문:

public override void SetLength(
    long value
)

다른 팁

파일을 만들어야 한다면 아마도 다음과 같이 할 수 있을 것 같습니다.

using (FileStream outFile = System.IO.File.Create(filename))
{
    outFile.Seek(<length_to_write>-1, SeekOrigin.Begin);
    OutFile.WriteByte(0);
}

여기서 length_to_write는 쓸 파일의 바이트 크기입니다.C# 구문이 올바른지 확신할 수 없지만(테스트할 컴퓨터에서는 아님) 과거에 C++에서 비슷한 작업을 수행했는데 제대로 작동했습니다.

불행하게도 끝까지 추구하는 것만으로는 실제로 이 일을 할 수 없습니다.그러면 파일 길이가 크게 설정되지만 실제로 저장을 위해 디스크 블록을 할당하지 않을 수도 있습니다.따라서 파일을 쓰려고 해도 여전히 실패합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top