Chcę programowo przenosić, kopiować i usuwać pliki i katalogi na karcie SD. Wyszukałem w Google, ale nie znalazłem nic przydatnego.
93
Użyj standardowego wejścia / wyjścia Java . Służy Environment.getExternalStorageDirectory()
do uzyskiwania dostępu do katalogu głównego pamięci zewnętrznej (na niektórych urządzeniach jest to karta SD).
cp
), aby wykonać kopię zapasową, zanim nadpiszę plik. Czy to możliwe?ustaw prawidłowe uprawnienia w manifeście
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
poniżej znajduje się funkcja, która programowo przeniesie plik
private void moveFile(String inputPath, String inputFile, String outputPath) { InputStream in = null; OutputStream out = null; try { //create output directory if it doesn't exist File dir = new File (outputPath); if (!dir.exists()) { dir.mkdirs(); } in = new FileInputStream(inputPath + inputFile); out = new FileOutputStream(outputPath + inputFile); byte[] buffer = new byte[1024]; int read; while ((read = in.read(buffer)) != -1) { out.write(buffer, 0, read); } in.close(); in = null; // write the output file out.flush(); out.close(); out = null; // delete the original file new File(inputPath + inputFile).delete(); } catch (FileNotFoundException fnfe1) { Log.e("tag", fnfe1.getMessage()); } catch (Exception e) { Log.e("tag", e.getMessage()); } }
Aby usunąć plik, użyj
private void deleteFile(String inputPath, String inputFile) { try { // delete the original file new File(inputPath + inputFile).delete(); } catch (Exception e) { Log.e("tag", e.getMessage()); } }
Kopiować
private void copyFile(String inputPath, String inputFile, String outputPath) { InputStream in = null; OutputStream out = null; try { //create output directory if it doesn't exist File dir = new File (outputPath); if (!dir.exists()) { dir.mkdirs(); } in = new FileInputStream(inputPath + inputFile); out = new FileOutputStream(outputPath + inputFile); byte[] buffer = new byte[1024]; int read; while ((read = in.read(buffer)) != -1) { out.write(buffer, 0, read); } in.close(); in = null; // write the output file (You have now copied the file) out.flush(); out.close(); out = null; } catch (FileNotFoundException fnfe1) { Log.e("tag", fnfe1.getMessage()); } catch (Exception e) { Log.e("tag", e.getMessage()); } }
źródło
Przenieś plik:
File from = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/kaic1/imagem.jpg"); File to = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/kaic2/imagem.jpg"); from.renameTo(to);
źródło
renameTo
nie udaje się bez żadnego wyjaśnieniaFunkcja przenoszenia plików:
private void moveFile(File file, File dir) throws IOException { File newFile = new File(dir, file.getName()); FileChannel outputChannel = null; FileChannel inputChannel = null; try { outputChannel = new FileOutputStream(newFile).getChannel(); inputChannel = new FileInputStream(file).getChannel(); inputChannel.transferTo(0, inputChannel.size(), outputChannel); inputChannel.close(); file.delete(); } finally { if (inputChannel != null) inputChannel.close(); if (outputChannel != null) outputChannel.close(); } }
źródło
file.delete()
Usunąć
public static void deleteRecursive(File fileOrDirectory) { if (fileOrDirectory.isDirectory()) for (File child : fileOrDirectory.listFiles()) deleteRecursive(child); fileOrDirectory.delete(); }
Sprawdź ten link dla powyższej funkcji.
Kopiuj
public static void copyDirectoryOneLocationToAnotherLocation(File sourceLocation, File targetLocation) throws IOException { if (sourceLocation.isDirectory()) { if (!targetLocation.exists()) { targetLocation.mkdir(); } String[] children = sourceLocation.list(); for (int i = 0; i < sourceLocation.listFiles().length; i++) { copyDirectoryOneLocationToAnotherLocation(new File(sourceLocation, children[i]), new File(targetLocation, children[i])); } } else { InputStream in = new FileInputStream(sourceLocation); OutputStream out = new FileOutputStream(targetLocation); // Copy the bits from instream to outstream byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } }
Ruszaj się
przenoszenie to nic innego jak skopiowanie folderu z jednej lokalizacji do drugiej, a następnie usunięcie folderu to jest
oczywisty
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
źródło
Uprawnienia:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Pobierz folder główny karty SD:
Environment.getExternalStorageDirectory()
Usuń plik: to jest przykład, jak usunąć wszystkie puste foldery w folderze głównym:
public static void deleteEmptyFolder(File rootFolder){ if (!rootFolder.isDirectory()) return; File[] childFiles = rootFolder.listFiles(); if (childFiles==null) return; if (childFiles.length == 0){ rootFolder.delete(); } else { for (File childFile : childFiles){ deleteEmptyFolder(childFile); } } }
Skopiuj plik:
public static void copyFile(File src, File dst) throws IOException { FileInputStream var2 = new FileInputStream(src); FileOutputStream var3 = new FileOutputStream(dst); byte[] var4 = new byte[1024]; int var5; while((var5 = var2.read(var4)) > 0) { var3.write(var4, 0, var5); } var2.close(); var3.close(); }
Przenieś plik = kopiuj + usuń plik źródłowy
źródło
File from = new File(Environment.getExternalStorageDirectory().getAbsolutePath().getAbsolutePath()+"/kaic1/imagem.jpg"); File to = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/kaic2/imagem.jpg"); from.renameTo(to);
źródło
Skopiuj plik za pomocą Square's Okio :
BufferedSink bufferedSink = Okio.buffer(Okio.sink(destinationFile)); bufferedSink.writeAll(Okio.source(sourceFile)); bufferedSink.close();
źródło
/** * Copy the local DB file of an application to the root of external storage directory * @param context the Context of application * @param dbName The name of the DB */ private void copyDbToExternalStorage(Context context , String dbName){ try { File name = context.getDatabasePath(dbName); File sdcardFile = new File(Environment.getExternalStorageDirectory() , "test.db");//The name of output file sdcardFile.createNewFile(); InputStream inputStream = null; OutputStream outputStream = null; inputStream = new FileInputStream(name); outputStream = new FileOutputStream(sdcardFile); byte[] buffer = new byte[1024]; int read; while ((read = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, read); } inputStream.close(); outputStream.flush(); outputStream.close(); } catch (Exception e) { Log.e("Exception" , e.toString()); } }
źródło
Jeśli używasz guawy, możesz użyć Files.move (od, do)
źródło
Xamarin Android
public static bool MoveFile(string CurrentFilePath, string NewFilePath) { try { using (var f = new File(CurrentFilePath)) using (var i = new FileInputStream(f)) using (var o = new FileOutputStream(NewFilePath)) { i.Channel.TransferTo(0, i.Channel.Size(), o.Channel); f.Delete(); } return true; } catch { return false; } } public static bool CopyFile(string CurrentFilePath, string NewFilePath) { try { using (var i = new FileInputStream(CurrentFilePath)) using (var o = new FileOutputStream(NewFilePath)) i.Channel.TransferTo(0, i.Channel.Size(), o.Channel); return true; } catch { return false; } } public static bool DeleteFile(string FilePath) { try { using (var file = new File(FilePath)) file.Delete(); return true; } catch { return false; } }
źródło
Aby przenieść plik, można użyć tego interfejsu API, ale potrzebujesz co najmniej 26 poziomu interfejsu API -
przenieś plik
Ale jeśli chcesz przenieść katalog, nie ma wsparcia, więc można użyć tego natywnego kodu
import org.apache.commons.io.FileUtils; import java.io.IOException; import java.io.File; public class FileModule { public void moveDirectory(String src, String des) { File srcDir = new File(src); File destDir = new File(des); try { FileUtils.moveDirectory(srcDir,destDir); } catch (Exception e) { Log.e("Exception" , e.toString()); } } public void deleteDirectory(String dir) { File delDir = new File(dir); try { FileUtils.deleteDirectory(delDir); } catch (IOException e) { Log.e("Exception" , e.toString()); } } }
źródło
Przenoszenie pliku za pomocą kotlin. Aplikacja musi mieć uprawnienia do zapisu pliku w katalogu docelowym.
@Throws(FileNotFoundException::class, IOError::class) private fun moveTo(source: File, dest: File, destDirectory: File? = null) { if (destDirectory?.exists() == false) { destDirectory.mkdir() } val fis = FileInputStream(source) val bufferLength = 1024 val buffer = ByteArray(bufferLength) val fos = FileOutputStream(dest) val bos = BufferedOutputStream(fos, bufferLength) var read = fis.read(buffer, 0, read) while (read != -1) { bos.write(buffer, 0, read) read = fis.read(buffer) // if read value is -1, it escapes loop. } fis.close() bos.flush() bos.close() if (!source.delete()) { HLog.w(TAG, klass, "failed to delete ${source.name}") } }
źródło
Przenieś plik lub folder:
public static void moveFile(File srcFileOrDirectory, File desFileOrDirectory) throws IOException { File newFile = new File(desFileOrDirectory, srcFileOrDirectory.getName()); try (FileChannel outputChannel = new FileOutputStream(newFile).getChannel(); FileChannel inputChannel = new FileInputStream(srcFileOrDirectory).getChannel()) { inputChannel.transferTo(0, inputChannel.size(), outputChannel); inputChannel.close(); deleteRecursive(srcFileOrDirectory); } } private static void deleteRecursive(File fileOrDirectory) { if (fileOrDirectory.isDirectory()) for (File child : Objects.requireNonNull(fileOrDirectory.listFiles())) deleteRecursive(child); fileOrDirectory.delete(); }
źródło