国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android文件基本操作(創(chuàng)建文件(夾)、復(fù)制文件(夾)、設(shè)置文件訪問(wèn)權(quán)限)

這篇具有很好參考價(jià)值的文章主要介紹了Android文件基本操作(創(chuàng)建文件(夾)、復(fù)制文件(夾)、設(shè)置文件訪問(wèn)權(quán)限)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、創(chuàng)建文件夾和文件

        // 獲取當(dāng)前包名的files路徑:/data/user/0/com.exa.myapplication/files
        val PATH = this.filesDir.absolutePath
        // 創(chuàng)建src和dst文件夾
        // 【注】需要有PATH目錄的權(quán)限才能創(chuàng)建子目錄
        // 若PATH文件夾權(quán)限為root權(quán)限,則使用adb shell chown命令修改權(quán)限
        val src = File(PATH + "/" + "src")
        // 判斷文件夾是否存在,不存在就進(jìn)行創(chuàng)建
        if (!src.exists()) {
            if (!src.mkdirs()){
                Log.e(TAG, "create directory failed.")
            }
        }
        val dst = File(PATH + "/" + "dst")
        if (!dst.exists()) {
            if (!dst.mkdirs()){
                Log.e(TAG, "create directory failed.")
            }
        }

        // 創(chuàng)建info.txt文件,并寫(xiě)入數(shù)據(jù)———"hello info"
        val srcPath = File("data/data/com.exa.myapplication/files/src/info.txt")
        val fos = FileOutputStream(srcPath)
        fos.write("hello info".toByteArray())
        fos.close()

二、復(fù)制文件

將src目錄下的info.txt復(fù)制到dst目錄并重命名為info_dst.txt
1、 方法一:調(diào)用java.nio.file.Files.copy()

		val srcPath = File("data/data/com.exa.myapplication/files/src/info.txt")		
        // 判斷源文件是否存在、可讀
        if (!srcPath.exists()){
            Log.i(TAG, "file is not exist.")
            return
        } else if (!srcPath.isFile){
            Log.i(TAG, "Not a file.")
            return
        } else if (!srcPath.canRead()){
            Log.i(TAG, "file is not readable.")
            return
        }        
        val fos = FileOutputStream(srcPath)
        fos.write("hello info".toByteArray())
        fos.close()
        // 設(shè)置目標(biāo)文件路徑
		val dstPath = File("data/data/com.exa.myapplication/files/dst/info_dst.txt")
        // 復(fù)制文件,第一個(gè)和第二個(gè)參數(shù)為PATH類型
        Files.copy(srcPath.toPath(), dstPath.toPath(), StandardCopyOption.REPLACE_EXISTING)

2、方法二:使用輸入輸出流

        val srcPath = File("data/data/com.exa.myapplication/files/src/info.txt")
        // 判斷源文件是否存在、可讀
        if (!srcPath.exists()){
            Log.i(TAG, "file is not exist.")
            return
        } else if (!srcPath.isFile){
            Log.i(TAG, "Not a file.")
            return
        } else if (!srcPath.canRead()){
            Log.i(TAG, "file is not readable.")
            return
        }
        val input = FileInputStream(srcPath)
		// 設(shè)置目標(biāo)文件路徑
        val output = FileOutputStream("data/data/com.exa.myapplication/files/dst/info_dst.txt")
        var length = -1
        val buf = ByteArray(1024)
        while(input.read(buf).also { length = it } != -1){
            output.write(buf, 0, length)
        }
        output.flush()
        input.close()
        output.close()

三、復(fù)制文件夾及其文件

	/**
	* 復(fù)制文件夾及其中的文件
	* @param oldPath String 原文件夾路徑 如:data/data/com.exa.myapplication/files/src
	* @param newPath String 復(fù)制后的路徑 如:data/data/com.exa.myapplication/files/dst
	* @return `true` if and only if the directory and files were copied;
	* `false` otherwise
	*/
    fun copyFolder(oldPath: String, newPath: String): Boolean {
        return try {
            val newFile = File(newPath)
            if (!newFile.exists()) {
                if (!newFile.mkdirs()) {
                    Log.e(TAG, "create directory failed.")
                    return false
                }
            }
            val oldFile = File(oldPath)
            // 獲取oldPath路徑下的全部文件
            val files = oldFile.list()
            var temp: File
            for (file in files) {
                temp = if (oldPath.endsWith(File.separator)) {
                    File(oldPath + file)
                } else {
                    File(oldPath + File.separator + file)
                }
                if (temp.isDirectory) {
                    // 如果temp是子文件夾,則繼續(xù)遞歸調(diào)用
                    copyFolder("$oldPath/$file", "$newPath/$file")
                }else if (temp.isFile && temp.exists() && temp.canRead()){
                    val fileInputStream = FileInputStream(temp)
                    val fileOutputStream = FileOutputStream(newPath + "/" + temp.name)
                    val buffer = ByteArray(1024)
                    var byteRead: Int
                    while (fileInputStream.read(buffer).also { byteRead = it } != -1) {
                        fileOutputStream.write(buffer, 0, byteRead)
                    }
                    fileInputStream.close()
                    fileOutputStream.flush()
                    fileOutputStream.close()
                }
            }
            true
        } catch (e: Exception) {
            e.printStackTrace()
            false
        }
    }

四、刪除文件或文件夾

1、刪除文件
只需要調(diào)用File的delete方法即可刪除指定文件

	File("x.txt").delete()

2、刪除文件夾
如果文件夾不為空,調(diào)用delete方法是無(wú)法刪除文件夾的。需要先刪除文件夾中包含的所有文件,最后再刪掉文件夾。

    fun deleteDirWihtFile(dir: File?) {
        if (dir == null || !dir.exists() || !dir.isDirectory) return
        for (file in dir.listFiles()) {
            if (file.isFile) {
                file.delete()    // 刪除所有文件
            } else if (file.isDirectory) {
                deleteDirWihtFile(file)    // 遞規(guī)的方式刪除文件夾
            }
        }
        dir.delete() // 刪除目錄本身
    }

五、設(shè)置文件的訪問(wèn)權(quán)限

1、方法一:使用File中的方法

        val file = File("data/data/com.exa.myapplication/files/src/info.txt")
        /**
         * 參數(shù)一是executable:為true時(shí)設(shè)置權(quán)限;為false時(shí)沒(méi)有該權(quán)限
         * 參數(shù)二是ownerOnly:為true時(shí)只對(duì)所有者生效;為false時(shí)對(duì)所有者,所在組和其它組都生效
         */
        file.setReadable(true, false)
        file.setWritable(true, false)
        file.setExecutable(true, false)

2、方法二:執(zhí)行授權(quán)命令

        val permissionsCmd = "chmod 777 data/data/com.exa.myapplication/files/src/info.txt"
        Runtime.getRuntime().exec(permissionsCmd)

需要說(shuō)明的是:
讀寫(xiě)文件的前提是該文件具有讀寫(xiě)權(quán)限
復(fù)制文件設(shè)置文件訪問(wèn)權(quán)限則需要app具有src和dst目錄的擁有者權(quán)限,一般的,app默認(rèn)是具有所在包名的權(quán)限為u0_a*:u0_a*(我這里是u0_a98:u0_a98),若目錄的擁有者權(quán)限為root:root,則app是無(wú)法在該目錄完成復(fù)制文件操作的,但可以通過(guò)Linux命令重新設(shè)置目錄權(quán)限,如下

adb shell chown system:system 目錄名	// app的AndroidManifest.xml需要添加android:sharedUserId="android.uid.system"

Android文件基本操作(創(chuàng)建文件(夾)、復(fù)制文件(夾)、設(shè)置文件訪問(wèn)權(quán)限)
最后,給出linux中文件系統(tǒng)基本權(quán)限的說(shuō)明圖,方便查閱
Android文件基本操作(創(chuàng)建文件(夾)、復(fù)制文件(夾)、設(shè)置文件訪問(wèn)權(quán)限)
【注意】
如果通過(guò)adb去push文件,該文件權(quán)限的擁有者和所屬組就不是u0_a98,而是其他,如u0_a0(如果執(zhí)行adb root成功了,會(huì)是root)。只要文件擁有者和所屬組不是u0_a98,app雖然可以讀,但沒(méi)有寫(xiě)權(quán)限,具體如下。
adb push new.txt data/data/com.test.pac/files
Android文件基本操作(創(chuàng)建文件(夾)、復(fù)制文件(夾)、設(shè)置文件訪問(wèn)權(quán)限)

當(dāng)app去寫(xiě)new.txt文件時(shí),會(huì)提示

W/System.err: java.io.FileNotFoundException: data/data/com.test.pac/files/new.txt: open failed: EACCES (Permission denied)

【解決辦法】
方法一:app自己創(chuàng)建文件,完成寫(xiě)操作
方法二:adb shell chown u0_a98:u0_a98 data/data/com.test.pac/files/new.txt文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-429908.html

到了這里,關(guān)于Android文件基本操作(創(chuàng)建文件(夾)、復(fù)制文件(夾)、設(shè)置文件訪問(wèn)權(quán)限)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • kibana創(chuàng)建索引、文檔基本操作

    kibana創(chuàng)建索引、文檔基本操作

    眾所周知,es和數(shù)據(jù)庫(kù)的操作十分相似,只是在一些稱呼上有所不同,如圖 因此,想要在es上存儲(chǔ)文檔,就得先 創(chuàng)建索引 (好比想要在數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù),就得先創(chuàng)建表,才能在表里插入數(shù)據(jù))。這次筆者主要是通過(guò)kibana進(jìn)行es相應(yīng)操作,所以給出kibana對(duì)應(yīng)的索引、文檔操作。

    2023年04月23日
    瀏覽(25)
  • GitHub操作之遠(yuǎn)程倉(cāng)庫(kù)基本操作(團(tuán)隊(duì)內(nèi)創(chuàng)建,推送,拉取等)

    GitHub操作之遠(yuǎn)程倉(cāng)庫(kù)基本操作(團(tuán)隊(duì)內(nèi)創(chuàng)建,推送,拉取等)

    itHub是一個(gè)面向開(kāi)源及私有軟件項(xiàng)目的托管平臺(tái),因?yàn)橹恢С諫it作為唯一的版本庫(kù)格式進(jìn)行托管,故名GitHub GitHub可以托管各種git庫(kù),并提供一個(gè)web界面,但它與外國(guó)的SourceForge、Google Code或中國(guó)的coding的服務(wù)不同,GitHub的獨(dú)特賣(mài)點(diǎn)在于從另外一個(gè)項(xiàng)目進(jìn)行分支的簡(jiǎn)易性。為一個(gè)

    2024年02月10日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】單鏈表基本操作:查找、插入、刪除、創(chuàng)建

    【數(shù)據(jù)結(jié)構(gòu)】單鏈表基本操作:查找、插入、刪除、創(chuàng)建

    ?鏈表由結(jié)點(diǎn)組成,結(jié)點(diǎn)由數(shù)據(jù)域和指針域組成。其中,數(shù)據(jù)域存放的就是數(shù)據(jù)元素,指針域存放下一個(gè)結(jié)點(diǎn)的地址。數(shù)據(jù)元素可以只有一個(gè),也可以有多個(gè)不同類型的數(shù)據(jù)元素,甚至是數(shù)組。下圖和代碼來(lái)自《C Primer Plus》,該鏈表每個(gè)節(jié)結(jié)點(diǎn)同時(shí)含char類型和int類型。 ??

    2024年02月02日
    瀏覽(97)
  • Android studio基本操作步驟

    Android studio基本操作步驟

    版本2021.3.1 建立新的項(xiàng)目 1.打開(kāi)app 2.點(diǎn)擊 Empty activity ,下一步 3.項(xiàng)目命名以及自定義路徑 4.版本匹配,這里改為24 5.將布局文件打開(kāi),并修改簡(jiǎn)單樣式。 6.書(shū)寫(xiě)輸入框

    2024年02月07日
    瀏覽(30)
  • 線性表的基本操作(初始化、創(chuàng)建、增、刪、查)

    目錄 順序表 順序表的定義和初始化 順序表的基本操作 1.求表長(zhǎng) 2.判空操作 3.創(chuàng)建順序表 4.輸出操作 5.插入操作 6.刪除操作 7.按位查找操作 8.按值查找操作 單鏈表 單鏈表的定義 單鏈表的初始化 求表長(zhǎng) 判空操作 ?尾插法建立單鏈表 頭插法建立單鏈表 輸出操作 前插操作 后插

    2024年02月08日
    瀏覽(20)
  • Python3操作SQLite3創(chuàng)建表主鍵自增長(zhǎng)|CRUD基本操作

    Python3操作SQLite3創(chuàng)建表主鍵自增長(zhǎng)|CRUD基本操作

    Win11查看安裝的Python路徑及安裝的庫(kù) Python PEP8 代碼規(guī)范常見(jiàn)問(wèn)題及解決方案 Python3操作MySQL8.XX創(chuàng)建表|CRUD基本操作 Python3操作SQLite3創(chuàng)建表主鍵自增長(zhǎng)|CRUD基本操作 anaconda3最新版安裝|使用詳情|Error: Please select a valid Python interpreter Python函數(shù)繪圖與高等代數(shù)互融實(shí)例(一):正弦函數(shù)與

    2024年02月07日
    瀏覽(15)
  • 電腦入門(mén):路由器 基本設(shè)置操作說(shuō)明

    路由器 ?基本設(shè)置操作說(shuō)明 首先我們我設(shè)置路由器,就需要先登錄路由器, 那么怎樣登路由器啊? 登錄路由器的方法是 ? 在ie的地址欄輸入:http://192.168.1.1 ?輸入完成以后直接回車 ?那么如果你輸入正確 這個(gè)時(shí)候就應(yīng)該聽(tīng)到有用戶名的提示 ?呵呵 這是怎么回事啊? ?不要召

    2024年02月11日
    瀏覽(23)
  • C語(yǔ)言單鏈表實(shí)現(xiàn)初始化、創(chuàng)建、增、刪、查等基本操作(詳細(xì))

    提示:文章參考王道的課程,相當(dāng)于課程筆記 目錄 一、單鏈表的定義及初始化 1、定義? ?2、初始化 ?1)不帶頭結(jié)點(diǎn)的單鏈表 ?2)帶頭節(jié)的單鏈表 ?二、單鏈表插入和刪除 1)插入 1、按位序插入(帶頭結(jié)點(diǎn)) 2、按位插入(不帶頭結(jié)點(diǎn))? 3、指定結(jié)點(diǎn)的后插操作 ?4、指定結(jié)點(diǎn)

    2023年04月08日
    瀏覽(34)
  • Python文件的基本操作

    文件的基本操作 文件的讀寫(xiě)模式 文件的讀寫(xiě)操作相關(guān)的方法 文件的操作模式 文件的練習(xí)題 文件的操作模式

    2024年02月10日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包