TransWikia.com

Как поменять местами содержимое файлов?

Stack Overflow на русском Asked by hawkkiller on November 20, 2021

Поменять местами содержимое файлов. Имеется код:

perform.setOnClickListener {

        val path1 = File(
                Environment.getExternalStorageDirectory(),
                "$filepath")
        val path2 = File(
                Environment.getExternalStorageDirectory(),
                "$filepath2")
        val fileExists1 = path1.exists()
        val fileExists2 = path2.exists()
        if(fileExists1) {
        }
        else filepath.setText("error", TextView.BufferType.EDITABLE)
        if(fileExists2) {
        }
        else filepath2.setText("error", TextView.BufferType.EDITABLE)
    }

3 Answers

Для обмена значений переменных существует еще и арифметический метод, без использования дополнительной переменной:

a = a + b; 
b = a - b; 
a = a - b;

К сожалению, к файлам такая простая арифметика не применима, если только не использовать некие низкоуровневые аналоги указателей для файловых систем...

Answered by serg.tortilliani on November 20, 2021

Если файлы расположены в одном разделе ФС (Environment.getExternalStorageDirectory() в обоих случаях намекает что так и есть), можно переименовать:

    val path1 = File(
            Environment.getExternalStorageDirectory(),
            "$filepath")
    val path2 = File(
            Environment.getExternalStorageDirectory(),
            "$filepath2")
    // здесь проверки исходных файлов
    // ....

    // мы не можем сразу переименовать один файл в другой, так как он существует
    // поэтому должны освободить одно имя
    // для этого создаём временное имя и переименовываем первый в него
    val tempPath = File(Environment.getExternalStorageDirectory(), "_tmp")
    path1.renameTo(tempPath)

    // второй в первый
    path2.renameTo(path1)

    // временный во второй
    tempPath.renameTo(path2)

Все проверки оставляю на вашей совести

Если в разных разделах - тогда только копировать.
Принцип тот же: через временный файл, но если файлы не большие, то можно без него - загрузить оба в оперативную память и записать наоборот.

Answered by woesss on November 20, 2021

Алгоритм обмена значениями двух переменных при помощи вспомогательной:

tmp = a;  
a = b;  
b = tmp;

Предположим есть некие функции:

String NameOf (File file); (* возвращает имя файла *)
void Rename (File file, String name); (* переименовывает файл *)

Алгоритм обмена содержимого файлов будет будет аналогичен вышеприведенному:

String name1 = NameOf (file1);  
Rename (file1, NameOf (file2));  
Rename (file2, name1);

Answered by serg.tortilliani on November 20, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP