2012-11-16 8 views
4

파일을 읽고 중복 내용을 찾기 위해 내용의 해시를 계산하려고했습니다. 문제는 Windows 8 (또는 WinRT 또는 windows 응용 프로그램을 저장하지만 불려서 완전히 혼란 스럽습니다)입니다. System.IOWindows.Storage으로 바뀌 었습니다. 이는 다르게 동작하며 매우 혼란 스럽습니다. 공식 문서는 전혀 유용하지 않습니다. Windows 8의 파일 IO

var picker = new Windows.Storage.Pickers.FolderPicker(); 
picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.MusicLibrary; 
picker.FileTypeFilter.Add("*"); 
var folder = await picker.PickSingleFolderAsync(); 
var files = await folder.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName); 

지금 파일에 내가 인덱스에 필요한 파일의 목록을 가지고 :

먼저 내 경우에는 내가 파일 선택기에서 폴더를 탐색에서 얻을 StorageFile 개체를 얻을 필요가있다. 다음으로, 해당 파일을 열 필요가 : 파일에서 데이터를 가져 오는 :

foreach (StorageFile file in files) 
{ 
    var filestream = file.OpenAsync(Windows.Storage.FileAccessMode.Read); 

지금 가장 혼란스러운 부분이다. 설명서가 쓸모 없어서 코드 예제를 찾을 수 없었습니다. 분명히 Microsoft는 파일을 여는 것보다 카메라에서 사진을 가져 오는 것이 더 중요하다고 생각했습니다.

파일 스트림에는 데이터를 읽는 것으로 생각되는 부재 ReadAsync이 있습니다. 이 메서드는 매개 변수로 버퍼를 필요로하고 다른 버퍼 (???)를 반환합니다. 그래서 버퍼를 만듭니다 :

var buffer = new Windows.Storage.Streams.Buffer(1024 * 1024 * 10); // 10 mb should be enough for an mp3 
    var resultbuffer = await filestream.ReadAsync(buffer, 1024 * 1024 * 10, Windows.Storage.Streams.InputStreamOptions.ReadAhead); 

나는 파일에 충분한 바이트가없는 경우 어떻게됩니까? 나는 문서에 어떤 정보도 보지 못했다.

이제이 파일의 해시를 계산해야합니다. ..., 내가 알고리즘 객체를 생성 할 필요가 수행

var alg = Windows.Security.Criptography.Core.HashAlgorithmProvider.OpenAlgorithm("md5"); 
    var hashbuff = alg.HashData(resultbuffer); 

    // Cleanup 
    filestream.Dispose(); 
나는 또한 덩어리에서 파일을 읽을 생각하지만, 어떻게 같은 해시를 계산할 수

? 나는 문서에서 사방을 보았고 이것에 대해서는 아무것도 발견하지 못했습니다. CryptographicHash 클래스 유형이 '추가'메소드 일 수 있습니까?

이제 다른 문제가 있습니다. 어떻게 이상한 버퍼로부터 바이트 배열로 데이터를 가져올 수 있습니까? IBuffer 클래스에는 'GetData'멤버가 없으므로 문서가 다시 쓸모가 없습니다.

그래서 내가 지금 할 수있는 모든 내가이 작업을 수행 할 수있는 방법 ...

// ??? 
} 

그래서 질문은 ... 우주의 신비에 대해 궁금해? 나는 완전히 혼란 스럽다. 그래서 나는 왜 마이크로 소프트가 파일을 읽도록 선택했는지 궁금하다 ... 그래서 ... 불가능하다! 총회 때조차도이 일보다 더 쉽게 이해할 수있었습니다.

+0

이 비슷한 질문보기 : http://stackoverflow.com/questions/12703816/how-to-read-file-metro-winrt/12704209#12704209 –

+0

[MSDN Magazine의 Windows 8 스페셜 에디션] (http : // msdn.microsoft.com/en-us/magazine/ee310108.aspx). 유용한 예제가 많이 있습니다. –

답변

2

.NET이 아니기 때문에 WinRT 또는 Windows 런타임과 .NET을 혼동해서는 안됩니다. WinRT는 Win32 API의 하위 집합에만 액세스 할 수 있지만 .NET과 같은 모든 것은 액세스 할 수 없습니다. WinRT의 rules and restrictions에 대한 기사가 있습니다.

일반적으로 WinRT는 파일 시스템에 대한 액세스 권한이 없습니다. 기능과 함께 작동하며 파일 액세스 권한을 허용 할 수 있지만 앱의 액세스가 특정 영역에만 제한됩니다. Here은 WinRT를 통한 파일 액세스 방법의 좋은 예입니다.