2013-02-01 30 views
9

Tôi hiện đang cố lưu một luồng chứa hình ảnh jpeg mà tôi đã quay lại từ máy ảnh vào thư mục lưu trữ cục bộ. Các tệp đang được tạo nhưng tiếc là không chứa dữ liệu nào cả. Đây là mã tôi đang cố gắng sử dụng:Lưu một luồng có chứa hình ảnh vào thư mục Địa phương trên Windows Phone 8

public async Task SaveToLocalFolderAsync(Stream file, string fileName) 
{ 
    StorageFolder localFolder = ApplicationData.Current.LocalFolder; 
    StorageFile storageFile = await localFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 

    using (IRandomAccessStream fileStream = await storageFile.OpenAsync(FileAccessMode.ReadWrite)) 
    { 
    using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0)) 
    { 
     using (DataWriter dataWriter = new DataWriter(outputStream)) 
     { 
     dataWriter.WriteBytes(UsefulOperations.StreamToBytes(file)); 
     await dataWriter.StoreAsync(); 
     dataWriter.DetachStream(); 
     } 
     await outputStream.FlushAsync(); 
    } 
    } 
} 

public static class UsefulOperations 
{ 
    public static byte[] StreamToBytes(Stream input) 
    { 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     input.CopyTo(ms); 
     return ms.ToArray(); 
    } 
    } 
} 

Bất kỳ trợ giúp nào lưu tệp theo cách này sẽ được đánh giá cao - tất cả trợ giúp tôi tìm thấy trực tuyến tham khảo lưu văn bản. Tôi đang sử dụng không gian tên Windows.Storage nên nó cũng hoạt động với Windows 8.

+0

Bạn có chắc chắn đây là Windows PHONE 8 không? Bạn không sử dụng 'IsolatedStorageFile.GetUserStoreForApplication()' –

+1

Hoàn toàn chắc chắn, bây giờ bạn có thể sử dụng không gian tên trên và mã cũng sẽ hoạt động trên Windows 8. –

+0

Tìm hiểu điều gì đó mới mẻ mỗi ngày :) –

Trả lời

26

Phương thức của bạn SaveToLocalFolderAsync chỉ hoạt động tốt. Tôi đã thử nó trên Stream Tôi đã chuyển vào và nó đã sao chép nội dung đầy đủ của nó như mong đợi.

Tôi đoán đó là sự cố với trạng thái luồng mà bạn đang chuyển đến phương thức. Có lẽ bạn chỉ cần thiết lập vị trí của nó để bắt đầu trước với file.Seek(0, SeekOrigin.Begin);. Nếu điều đó không hiệu quả, hãy thêm mã đó vào câu hỏi của bạn để chúng tôi có thể giúp bạn.

Ngoài ra, bạn có thể làm cho mã của mình đơn giản hơn nhiều. Sau đây thực hiện chính xác như cũ mà không có các lớp trung gian:

public async Task SaveToLocalFolderAsync(Stream file, string fileName) 
{ 
    StorageFolder localFolder = ApplicationData.Current.LocalFolder; 
    StorageFile storageFile = await localFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 
    using (Stream outputStream = await storageFile.OpenStreamForWriteAsync()) 
    { 
     await file.CopyToAsync(outputStream); 
    } 
} 
+0

cảm ơn, điều đó có thể đúng, tôi sẽ xem xét ngay hôm nay. –

+0

Bạn đã chính xác, vị trí phát trực tiếp ở cuối. Cậu học sinh sai lầm. Mã bạn đã có ở trên là đơn giản hơn rất nhiều vì vậy tôi sẽ sử dụng nó để thay thế. Cảm ơn –

+0

Đã chết, tôi đã vô tình vô tình. Bạn có thể chỉnh sửa nó một chút để tôi có thể tái biểu quyết không? –

Các vấn đề liên quan