Android 创建文件,删除文件,加载本地txt文件,string转txt文件,创建文件夹,读取文件夹,open failed: ENOENT

  private synchronized void writeLogToFile(String message) {
            if (TextUtils.isEmpty(message)) {
                return;
            }
            try {
                String fileName = "log_" + dateFormat.format(new Date()) + ".txt";
                File logFile = new File(logDir, fileName);
                FileWriter writer = new FileWriter(logFile, true);
                writer.append(message);
                writer.append('\n');
                writer.flush();
                writer.close();
            } catch (IOException e) {
                Log.e(TAG, "Failed to write log to file", e);
            }
        }

android:requestLegacyExternalStorage="true"
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
   <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
       tools:ignore="ProtectedPermissions"/>

1、创建文件

String fileName = "my.txt";
File fs = new File(Environment.getExternalStorageDirectory() + "/msc/" + fileName);

安卓10内存文件 

String downFileDir = context.getFilesDir().getAbsolutePath();
File dest = new File(downFileDir, tempName);

msc可要可不要   或者是"/"

创建图片文件

final File file = File.createTempFile(UUID.randomUUID().toString() + "", ".jpg");

2、删除文件

                String ss = "/mnt/sdcard/my.txt";
//                String ss = "/storage/emulated/0/Pictures/Screenshots/Screenshot_20190814-141238.jpg";
                File file = new File(ss);
                if (file.exists()){
                file.delete();
                }

 /mnt/sdcard/     等于   /storage/emulated/0/

3、string转为本地txt文件

String fileName = "my.txt";
File fs = new File(Environment.getExternalStorageDirectory()+"/"  + fileName);
if (fs.exists()){
    fs.delete();
}
String charset = "UTF-8";
// 写字符换转成字节流
try {
    FileOutputStream outputStream = new FileOutputStream(fs);
    OutputStreamWriter writer = new OutputStreamWriter(
            outputStream, charset);
    try {
        writer.write("这是要保存的中文字符aaabbbb大范围sdfsdfsf");
    } finally {
        writer.close();
    }

} catch (IOException e) {
    e.printStackTrace();
}

文件夹不存在时——open failed: ENOENT (No such file or directory)。解决方法----创建文件夹即可

if (fs.exists()){
    fs.delete();
}else {
    fs.getParentFile().mkdirs();
}

4、读取本地txt文件,转为string

String fname = "/mnt/sdcard/my.txt";
private String loadTXTFromSDFile(String fname) {
    String result=null;
    try {
        File f=new File(fname);
        int length=(int)f.length();
        byte[] buff=new byte[length];
        FileInputStream fin=new FileInputStream(f);
        fin.read(buff);
        fin.close();
        result=new String(buff,"UTF-8");
    }catch (Exception e){
        e.printStackTrace();
    }
    return result;
}

5、创建文件夹

// 文件存储
private File updateDir = null;
// 创建文件
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
    updateDir = new File(Environment.getExternalStorageDirectory(), "data/cn.dlc.xiaoyao/msc2");
    if (!updateDir.exists()) {
        updateDir.mkdirs();
        LogPlus.i("lgq","bbh-ss-video_savePath--333-  ");
    }
}

6、读取文件夹内容 

File sceneFile = new File(Environment.getExternalStorageDirectory(), "data/cn.dlc.xiaoyao/msc1");
LogPlus.i("lgq","bbh-ss-video_savePath---  "+sceneFile.exists());

File[] files = sceneFile.listFiles();

if (null != files) {

    for (int i = 0; i < files.length; i++) {

        LogPlus.e("lgq文件夹下的文件:" + files[i].getName()+"......"+files[i].getPath()+"..."+getAudioFileVoiceTime(files[i].getPath()));

    }

}

    /**
     * 删除旧的文件
     */
    public static void deleteOldestLogFile(File logDir) {
        File[] logFiles = logDir.listFiles();
        if (logFiles != null && logFiles.length > 3) {
            Arrays.sort(logFiles, new Comparator<File>() {
                @Override
                public int compare(File f1, File f2) {
                    return Long.compare(f2.lastModified(), f1.lastModified());
                }
            });

            // 保留最新的三个日志文件,删除其他的文件
            for (int i = 2; i < logFiles.length; i++) {
                File fileToDelete = logFiles[i];
                if (!fileToDelete.delete()) {
                    Timber.tag(TAG).e("Failed to delete log file: %s", fileToDelete.getAbsolutePath());
                }
            }
        }

    }

### 如何在 VXE-Table 中实现复选框的全选与取消选择功能 VXE-Table 是一款基于 Vue 的高性能表格组件库,支持多种复杂场景下的数据展示需求。以下是关于如何在 VXE-Table 中实现复选框的全选与取消选择功能的具体说明。 #### 1. 基础配置 为了实现全选和取消选择的功能,在初始化 `vxe-table` 表格时需要设置一些必要的属性。例如,通过启用 `checkbox-config` 配置项来开启复选框功能[^1]: ```vue <template> <vxe-table :data="tableData" ref="xTable"> <!-- 启用复选框 --> <vxe-column type="checkbox" width="60"></vxe-column> <vxe-column field="name" title="Name"></vxe-column> <vxe-column field="age" title="Age"></vxe-column> </vxe-table> </template> <script> export default { data() { return { tableData: [ { name: 'John', age: 25 }, { name: 'Doe', age: 30 } ] }; } }; </script> ``` 上述代码片段展示了如何在列定义中加入复选框列,并绑定到表格的数据源上。 --- #### 2. 实现全选逻辑 要实现全选功能,可以通过监听复选框的状态变化事件并手动控制其行为。具体来说,可以利用 `check-all-method` 或者直接操作 API 来完成这一目标[^4]。 下面是一个完整的示例,演示了如何通过按钮触发全选或取消全选操作: ```vue <template> <div> <button @click="selectAll">全选</button> <button @click="clearAll">取消全选</button> <vxe-table :data="tableData" ref="xTable"> <vxe-column type="checkbox" width="60"></vxe-column> <vxe-column field="name" title="Name"></vxe-column> <vxe-column field="age" title="Age"></vxe-column> </vxe-table> </div> </template> <script> import XEUtils from 'xe-utils'; export default { data() { return { tableData: [ { name: 'John', age: 25 }, { name: 'Doe', age: 30 } ], selectionList: [] }; }, methods: { selectAll() { const $table = this.$refs.xTable; $table.setAllCheckboxRow(true); // 设置所有行被勾选 }, clearAll() { const $table = this.$refs.xTable; $table.clearCheckboxRow(); // 清除所有已勾选的行 } } }; </script> ``` 在此代码中,调用了 `setAllCheckboxRow` 和 `clearCheckboxRow` 方法分别用于执行全选和清除操作--- #### 3. 获取选中记录的值 当用户完成了某些行的选择之后,通常还需要获取这些选定行的相关信息以便进一步处理。这一步骤可通过访问 `$refs.xTable.getCheckboxRecords()` 完成: ```javascript getSelectedRows() { const selectedRows = this.$refs.xTable.getCheckboxRecords(); console.log('选中的行:', selectedRows); } ``` 此方法会返回一个包含所有当前已被选中行的对象数组。 --- #### 4. 处理联动关系 除了基本的全选/反选外,还需注意保持“全选”复选框与其他单个复选框之间的同步状态一致性。即当页面上的任意一项发生变化时,应自动调整顶部“全选”的显示状况;反之亦然[^3]。 可以在 `cell-change` 或其他类似的回调函数内部编写相应的判断条件来进行实时监控以及更新视图层的表现形式。 --- ### 总结 综上所述,借助于 VXE-Table 提供的强大工具集及其灵活可定制化的特性,我们可以轻松构建出满足实际业务需求的各种交互体验良好的界面控件组合方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值