2010-12-28 38 views
11

Tôi đã kéo tóc ra khỏi cái này một lúc rồi. Phương pháp sau đây được yêu cầu tải xuống tệp và lưu tệp đó vào vị trí được chỉ định trên ổ đĩa cứng.Phương thức mkdirs() không hoạt động trong android/java

private static void saveImage(Context context, boolean backgroundUpdate, URL url, File file) { 

    if (!Tools.checkNetworkState(context, backgroundUpdate)) 
     return; 

    // Get the image 
    try { 
     // Make the file 
     file.getParentFile().mkdirs(); 

     // Set up the connection 
     URLConnection uCon = url.openConnection(); 
     InputStream is = uCon.getInputStream(); 
     BufferedInputStream bis = new BufferedInputStream(is); 

     // Download the data 
     ByteArrayBuffer baf = new ByteArrayBuffer(50); 
     int current = 0; 
     while ((current = bis.read()) != -1) { 
       baf.append((byte) current); 
     } 

     // Write the bits to the file 
     OutputStream os = new FileOutputStream(file); 
     os.write(baf.toByteArray()); 
     os.close(); 
    } catch (Exception e) { 
     // Any exception is probably a newtork faiilure, bail 
     return; 
    } 
} 

Ngoài ra, nếu tệp không tồn tại, bạn phải tạo thư mục cho tệp. (Và nếu có một tập tin khác đã có ở chỗ đó, nó không nên làm gì cả). Tuy nhiên, vì một số lý do, phương thức mkdirs() không bao giờ làm cho thư mục. Tôi đã thử tất cả mọi thứ từ dấu ngoặc đơn rõ ràng, để rõ ràng làm cho lớp tập tin cha mẹ, và không có gì có vẻ làm việc. Tôi khá chắc chắn rằng các ổ đĩa có thể ghi được, vì nó chỉ được gọi sau khi đã được xác định, đó cũng là sự thật sau khi chạy qua nó trong khi gỡ lỗi. Vì vậy, phương pháp thất bại vì các thư mục cha mẹ không được thực hiện. Bất cứ ai có thể cho tôi biết nếu có bất cứ điều gì sai trái với cách tôi gọi nó?

Ngoài ra, nếu nó giúp, đây là nguồn gốc cho các tập tin tôi gọi nó trong:

https://github.com/LeifAndersen/NetCatch/blob/master/src/net/leifandersen/mobile/android/netcatch/services/RSSService.java

Cảm ơn bạn

Trả lời

30

Nếu bạn đang viết nội dung vào thẻ SD của bạn hy vọng bạn đã thêm android.permission.WRITE_EXTERNAL_STORAGE phép trong bạn manifest

+0

Tôi không thể tin được, điều đó đã hiệu quả. Bây giờ tôi cảm thấy như một thằng ngốc. Mặt khác, nó đã được kỳ diệu làm việc khác sửa đổi khác của dự án, lạ. Cảm ơn bạn rất nhiều. –

3

Bạn có chắc chắn rằng mkdirs được không? Tại sao bạn không kiểm tra giá trị trả về của cuộc gọi mkdirs và đăng nhập một thông báo lỗi nếu nó trả về false?

if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()){ 
    log("Unable to create " + file.getParentFile()); 
} 

Tôi nghi ngờ rằng bạn có thể ngạc nhiên với những gì các tập tin được ...

PS - và hãy làm điều gì đó với xử lý lỗi - ở mức tối thiểu, đăng nhập lỗi. Bắt ngoại lệ và làm một sự trở lại im lặng là thực hành khủng khiếp.

+0

Cuộc gọi tốt khi đăng nhập lỗi, đó là một ý tưởng hay và tôi đã thay đổi nó ngay bây giờ. Và đó là tuyên bố rằng nó không thể tạo ra các tập tin (chèn lỗi của bạn trong của họ như gợi ý). –

13

Vui lòng kiểm tra với điều này, nó có thể giúp bạn ..

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

nhập tis phép trong biểu hiện của bạn tập tin.

+0

Yup, đúng vậy. –

5

Hơn nữa để trả lời của Kevin Day, có một phương thức lỗi khác mà các bài đăng trước đó không đề cập đến. Đó là ngay cả khi bạn có android.permission.WRITE_EXTERNAL_STORAGE trong tệp kê khai, nếu bạn đang cố gắng ghi vào phương tiện như /mnt/sdcard được gắn bên ngoài dưới dạng tiện ích USB (tức là bạn đã kết nối thiết bị của mình dưới dạng ổ đĩa ngoài với PC bằng cáp USB) thời gian bạn đang cố gắng để viết, sau đó bạn không thể ghi vào hệ thống tập tin/mnt/sdcard. Trong trường hợp này, FILE.mkdir sẽ trả về false. Rõ ràng, nếu bạn không kiểm tra mã trả về, bạn sẽ không thấy vấn đề này cho đến khi bạn nhận được IOException nếu bạn cố gắng tạo tệp trong thư mục mà bạn nghĩ rằng bạn đã tạo. Và nếu bạn không tạo một tệp trong thư mục không tồn tại này thì ứng dụng sẽ âm thầm không thành công.

Tôi thường xuyên mắc phải lỗi này khi gỡ lỗi ứng dụng Android - quên rằng tôi không thể có cả sdcard được gắn bên ngoài và đồng thời ứng dụng của tôi sẽ ghi vào đó.

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