精华内容
下载资源
问答
  • Android文件存储目录结构

    千次阅读 2017-06-01 16:28:37
    应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。... 6.0之后,根目录文件存储是需要用户授权的,就算你在AndroidManifest.xml中配置了存储权限,用户不授权也是写不进
    应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。
    大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。

    这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。

    并且在API 6.0之后,根目录文件存储是需要用户授权的,就算你在AndroidManifest.xml中配置了存储权限,用户不授权也是写不进去了。

    SD卡读写权限:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?


    通过context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
    通过context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据

    如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。并且

    这个方法获得的文件存储路径适用于6.0以后系统,只要AndroidManifest.xml配置读写权限了,就不需要用户再授权了。 

    正常开发中获取存储路径的方法是:

    public String getDiskCacheDir(Context context) {  
        String cachePath = null;  
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())  
                || !Environment.isExternalStorageRemovable()) {  
            cachePath = context.getExternalCacheDir().getPath();  
        } else {  
            cachePath = context.getCacheDir().getPath();  
        }  
        return cachePath;  
    }  

    可以看到,当SD卡存在或者SD卡不可被移除的时候,就调用getExternalCacheDir()方法来获取缓存路径,否则就调用getCacheDir()方法来获取缓存路径。前者获取到的就是 /sdcard/Android/data/<application package>/cache 这个路径,而后者获取到的是 /data/data/<application package>/cache 这个路径。

    设置->应用->应用详情里面的”清除数据“与”清除缓存“选项分别对应的是data/data/<application package>/和data/data/<application package>/cache


    external storage (外部存储):

    Environment.getExternalStorageDirectory()SD根目录:/mnt/sdcard/ (6.0后写入需要用户授权)

    context.getExternalFilesDir(dir)路径为:/mnt/sdcard/Android/data/< package name >/files/… 

    context.getExternalCacheDir()路径为:/mnt/sdcard//Android/data/< package name >/cache/…

    internal storage(内部存储):

    context.getFilesDir()路径是:/data/data/< package name >/files/…

    context.getCacheDir()路径是:/data/data/< package name >/cach/…


    红米2A:
    根目录
    根目录->system-----------------------------------------------------------Environment.getRootDirectory()
    根目录->system->app(放置系统自带软件.apk文件)
    根目录->cache-------------------------------------------------------------Environment.getDownloadCacheDirectory()
    根目录->data(需要root)--------------------------------------------------Environment.getDataDirectory()
    根目录->data->app(放置自己安装APP.apk文件)
    根目录->data->data-------------------------------------------------------Environment.getDataDirectory()
    根目录->data->data->com.luoguopeng.ldrone(联想目录:/data/user/0/com.luoguopeng.ldrone/cache)
    根目录->data->data->com.luoguopeng.ldrone->app_Map_Assert
    根目录->data->data->com.luoguopeng.ldrone->cache---------context.getCacheDir()
    根目录->data->data->com.luoguopeng.ldrone->database
    根目录->data->data->com.luoguopeng.ldrone->files
    根目录->data->data->com.luoguopeng.ldrone->lib(放置.so)
    根目录->data->data->com.luoguopeng.ldrone->share_prefs
    根目录->mnt/shell/emulated/0------------------------------------------Environment.getExternalStorageDirectory()
    根目录->mnt/shell/emulated/0->Android
    根目录->mnt/shell/emulated/0->Android->data
    根目录->mnt/shell/emulated/0->Android->data->com.luoguopeng.ldrone
    根目录->mnt/shell/emulated/0->Android->data->com.luoguopeng.ldrone->cache--------context.getExternalCacheDir()
    根目录->mnt/shell/emulated/0->Android->data->com.luoguopeng.ldrone->files/DCIM----context.getExternalFilesDir(Environment.DIRECTORY_DCIM)
    根目录->mnt/shell/emulated/0->DCIM---------------Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)

    展开全文
  • linux下的文件目录存储结构总结

    千次阅读 2017-11-15 19:46:07
    1、一切从“/”开始linux下并不存在C/D/E/F盘,所有的文件目录都是以树形结构划分的,并且每个文件都规定了自己的作用范围。 每个目录的具体作用: 常用的一些目录目录名称 应放置文件的内容 /boot 开机所需...

    1、一切从“/”开始

    linux下并不存在C/D/E/F盘,所有的文件及目录都是以树形结构划分的,并且每个文件都规定了自己的作用范围。
    

    每个目录的具体作用:
    

    这里写图片描述

    常用的一些目录:
    目录名称            应放置文件的内容
    /boot           开机所需文件——内核,开机菜单及所需配置文件等
    /dev            任何设备与接口都以文件形式存放在此目录
    /etc            配置文件
    /home           用户主目录
    /bin            单用户维护模式下还能够被操作的命令
    /lib            开机时用到的函数库及/bin与/sbin下面命令要调用的函数
    /sbin           开机过程中需要的
    /media          一般挂载或删除的设备
    /opt            放置第三方的软件
    /root           系统管理员的主文件夹
    /srv            一些网络服务的数据目录
    /tmp            任何人均可使用的“共享”临时目录
    /proc           虚拟文件系统,例如系统内核,进程,外部设备及网络状态等
    /usr/local      用户自行安装的软件
    /usr/sbin       非系统开机时需要的软件/命令/脚本
    /usr/share      帮助与说明文件,也可放置共享文件。
    /var            主要存放经常变化的文件,如日志。
    /lost+found     当文件系统发生错误时,将一些丢失的文件片段存放在这里
    

    2、linux中的物理设备

    linux中一切皆文件,那么物理设备的命名也不例外:系统内核的设备管理器(Udev)会自动将硬件名称规范起来,让我们可以通过设备名称猜出设备大致的属性以及分区信息等,Udev会一直以守护进程的形式运行并侦听来自内核发出的uevent来管理/dev目录下的设备文件。
    

    常见的硬件命名:

    硬件设备            文件名称
    IDE设备            /dev/hd[a-d]
    SCSI/SATA/U盘     /dev/sd[a-p]
    软驱              /dev/fd[0-1]
    打印机            /dev/lp[0-15]
    光驱              /dev/cdrom
    鼠标              /dev/mouse
    磁带机            /dev/st0或/dev/ht0(IDE设备)
    

    现在的一般硬盘设备都是“/dev/sd…”,一台主机上可以有多块硬盘,a-p来表示16块硬盘(默认从a开始分配)
    主分区从1-4开始分配(这里划分主分区时,可以指定数字)。
    逻辑分区从5开始分配。

    "/dev/sda5"代表的意思就是,编号为a的硬盘,5代表了这是一块逻辑分区。
    

    在物理结构中,存储结构如下图:

    3、硬盘有什么分区

    linux中规定:
    最多有4个主分区,其余的为扩展分区,其中,扩展分区可以被划分为多个逻辑分区,逻辑分区的数量没有限制。linux中还有swap交换分区,SWAP即交换分区是一种类似于Windows系统虚拟内存的功能,将一部分硬盘空间虚拟成内存来使用,从而解决内存容量不足的情况,因为SWAP毕竟是用硬盘资源虚拟的,所以速度上比真实物理内存要慢很多,一般只有当真实物理内存耗尽时才会调用SWAP。
    我们可以这样去认为,主分区就类似于windows中的c盘,是系统盘,逻辑分区就类似于DEF盘
    

    接下来要去学习 真正分区的步骤和挂载。

    展开全文
  • 文件目录在存储的存储结构

    千次阅读 2018-01-24 12:56:37
    超级块存放文件系统本身的结构信息。i-节点表存放文件本身的属性(*i-节点在文件系统中的位置是固定的,序号从0开始)。 数据区存放文件的内容。 创建文件的过程:  (1)、内核先找到一个空的i节点。将文件属性...

    文件系统的三个区域分别为:(1)超级块(2)i-节点表(3)数据区

    超级块存放文件系统本身的结构信息。i-节点表存放文件本身的属性(*i-节点在文件系统中的位置是固定的,序号从0开始)。

    数据区存放文件的内容。

    创建文件的过程:

     (1)、内核先找到一个空的i节点。将文件属性存储在i节点中

     (2)、将文件的内容存在数据块中。

     (3)、将文件内容在数据块中的序号按文件内容的先后顺序存放在i-节点的磁盘分布区。

     (4)、内核将文件入口(i-节点序号,文件名字)添加到目录文件。文件名和i-节点号之间的对应关系将文件名和文件的内容及属性连接去来。


    目录是抽象模型是一个包含i-节点号和文件名的表。

    从目录文件找到数据的步骤:(跟创建文件的顺序相反)


     (1)根据文件名在目录中找到文件i节点序号

     (2)根据i-节点的序号定位i-节点的位置,并且读取i-节点的内容。

     (3)通过i-节点中存储的文件内容所在数据块位置的信息,在数据块中查找文件的内容(调用read函数)


    这也是对目录的操作第一个总是调用open函数的原因。

    当文件太大时候,采用间接存储的方法,将i-节点的分配链表存储不下的内容存在数据块中, 这种块被称为间接块。

    硬链接是指向数据块的,因此i-节点号相同,符号链接是指向原本指向数据块的i节点对应的文件名,因此删除源文件,只是断开一个i-节点和数据块的链接,硬链接还可以查看文件内容,而如果删除符号链接所链接的文件,符号链接不能通过i-节点找到文件内容所在块,所有符号链接会失效。

    硬链接不能跨越文件系统,符号链接可以。

    设备文件:

    设备文件是链接,设备文件的i-节点存储的是指向内核子程序的指针,而不是文件大小和存储列表,内核中传输设备数据的子程序被称为设备驱动程序。

    磁盘文件与内核之间有缓冲,设备文件与磁盘之间没有缓冲。

    缓冲:

     

    #include<fcntl.h>
    int s;
    s = fcntl(fd,F_GETFL);
    s |= O_SYNC;
    result = fcntl(fd,F_SETFL,s);
    if(result == 1)
    perror("setting  SYNC");
    

    位逻辑或操作打开位哦O_SYNC,该位告诉内核,对write的调用仅能在数据写入实际的硬件时才能返回,而不是在数据复制到内核缓冲时就执行默认 的返回操作。


    展开全文
  • Android 文件外/内部存储的获取各种存储目录路径

    万次阅读 多人点赞 2018-06-12 14:51:50
    对于很多做Android开发的同学来说,可能认为文件存储很简单,调用一些诸如getFilesDir,getExternalStorageDirectory方法行了,但是虽然说它们会调用相应的方法来实现简单的数据存储。但是他们未必就搞懂了他的数据...

    前言

        对于任何一个应用来说,无论是PC端应用还是Android应用,存储肯定是必不可少的。对于很多做Android开发的同学来说,可能认为文件存储很简单,调用一些诸如getFilesDir,getExternalStorageDirectory方法行了,但是虽然说它们会调用相应的方法来实现简单的数据存储。但是他们未必就搞懂了他的数据到底存在了哪里,以及他的数据是否存对了地方,或者是否做好了版本兼容。下面我将从这几个地方来解答大家常见的困惑。

    目录:

    • Android中内部存储,外部存储的概念 ;
    • getDataDirectory,getFilesDir,getCacheDir,getDir,getExternalStorageDirectory,getExternalStoragePublicDirectory,getExternalFilesDir,getExternalCacheDir,getExternalCacheDir,getRootDirectory等方法区别联系 。
    • 清除数据和清除缓存到底清除了什么数据 ;
    • /storage/sdcard,/sdcard,/mnt/sdcard,/storage/emulated/0之间的关系 ;
    • 一张图看懂Ram,Rom,以及扩展存储(TF卡)的区别;内部存储,外部存储的区别。


    一、Android中内部存储,外部存储的概念

    (1)内部存储 

    概念:注意内部存储不是内存。内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。 

    访问内部存储的API方法: 

    1、Environment.getDataDirectory() 
    2、getFilesDir().getAbsolutePath() 
    3、getCacheDir().getAbsolutePath() 

    4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath() 


    (2)外部存储 

    概念:最容易混淆的是外部存储,因为老的Android系统的跟新的Android系统是有差别的,很多人去网上查找资料,看了一下以前的资料,又看了一下现在的资料,但是发现它们说法不一样然后就困惑了。首先说一个大家普遍的概念“如果在pc机上是区分外部存储和内部存储的话,那么电脑自带的硬盘算是内部存储,U盘或者移动硬盘就是外部存储了。”因此很多人带着这样的理解去看待安卓手机,把内置存储(机身存储)当做内部存储,而把扩展的SD卡当做是外部存储。这么认为确实没错,因为在4.4(API19)以前的手机上确实是这样的,手机自身带的存储卡就是内部存储,而扩展的SD卡就是外部存储。但是从4.4的系统开始,很多的中高端机器都将自己的机身存储扩展到了8G以上,比如有的人的手机是16G的,有的人的手机是32G的,但是这个16G,32G是内部存储吗,不是的!!!,它们依然是外部存储,也就是说4.4系统及以上的手机将机身存储存储(手机自身带的存储叫做机身存储)在概念上分成了”内部存储internal” 和”外部存储external” 两部分。既然16G,32G是外部存储,那有人又有疑惑了,那4.4系统及以上的手机要是插了SD卡呢,SD卡又是什么呢,如果SD卡也是外部存储的话,那怎么区分机身存储的外部存储跟SD卡的外部存储呢?对,SD卡也是外部存储,那怎么区分呢,在4.4以后的系统中,API提供了这样一个方法来遍历手机的外部存储路径: 

    File[] files;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
        for(File file:files){
            Log.e("main",file);
        }
    }

    如果你的手机插了SD卡的话,那么它打印的路径就有两条了,例如我的华为荣耀7插了SD卡,它的结果如下: 

    /storage/emulated/0/Android/data/packname/files/mounted 
    /storage/B3E4-1711/Android/data/packname/files/mounted 
    其中/storage/emulated/0目录就是机身存储的外部存储路径 
    而/storage/B3E4-1711/就是SD卡的路径 
    他们统称为外部存储 
    访问外部存储的API方法: 
    1、Environment.getExternalStorageDirectory().getAbsolutePath() 
    2、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath() 
    3、getExternalFilesDir(“”).getAbsolutePath() 
    4、getExternalCacheDir().getAbsolutePath() 

        

        大家对Android的外部存储会产生疑问,主要是现在很多的手机已经从物理上看不到外部存储了,以前的手机都有,就是那种黑色的内存卡,8G,16G,32G的,可以像U盘一样插拔,以前很流行,存储空间不够了,就去买个内存卡(准确说是SD卡,说成内存卡又会引起误解)回来,后来的手机比如现在我用的华为荣耀7,厂家已经把机身存储扩展到了16G了,只是在存储概念上了分为了内部存储(内部internal)和外部存储(外部external),其实它们都集成在一起了。当然如果你觉得16G不够用,那他支持通过插SD卡来扩充容量吗?支持的,荣耀7为例,它是三合二卡槽。卡槽1:Nano SIM卡;卡槽2:Nano SIM卡或Micro SD卡。默认卡槽1为4G主卡,可以在设置中更改4G主卡卡槽;不支持热插拔,插拔卡托后需重启手机。这样插入的SD卡也属于外部存储。所以手机的外部存储可能包含两部分,一是机身存储的外部存储部分,还有一个是SD卡部分。


    二、getDataDirectory,getFilesDir,getCacheDir,getDir,getExternalStorageDirectory,getExternalStoragePublicDirectory,getExternalFilesDir,getExternalCacheDir,getExternalCacheDir,getRootDirectory的区别和联系

    上面这些方法,我们可能似曾相识,但是对于有些同学来说却又很难分清出,主要还是不同的Android版本的问题。为了方便大家理解,我先简要介绍以上各个方法,为方便大家理解我把这些方法的结果打印出来(以下的打印结果是基于荣耀7的(系统版本6.0): 
    1、Environment.getDataDirectory() = /data 
    这个方法是获取内部存储的根路径 
    2、getFilesDir().getAbsolutePath() = /data/user/0/packname/files 
    这个方法是获取某个应用在内部存储中的files路径 
    3、getCacheDir().getAbsolutePath() = /data/user/0/packname/cache 
    这个方法是获取某个应用在内部存储中的cache路径 
    4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath() = /data/user/0/packname/app_myFile 
    这个方法是获取某个应用在内部存储中的自定义路径 
    方法2,3,4的路径中都带有包名,说明他们是属于某个应用 
    ………………………………………………………………………………………… 
    5、Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0 
    这个方法是获取外部存储的根路径 
    6、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath() = /storage/emulated/0 
    这个方法是获取外部存储的根路径 
    7、getExternalFilesDir(“”).getAbsolutePath() = /storage/emulated/0/Android/data/packname/files 
    这个方法是获取某个应用在外部存储中的files路径 
    8、getExternalCacheDir().getAbsolutePath() = /storage/emulated/0/Android/data/packname/cache 
    这个方法是获取某个应用在外部存储中的cache路径 


    注意:其中方法7和方法8如果在4.4以前的系统中getExternalFilesDir(“”)和getExternalCacheDir()将返回null,如果是4.4及以上的系统才会返回上面的结果,也即4.4以前的系统没插SD卡的话,就没有外部存储,它的SD卡就等于外部存储;而4.4及以后的系统外部存储包括两部分,getExternalFilesDir(“”)和getExternalCacheDir()获取的是机身存储的外部存储部分,也即4.4及以后的系统你不插SD卡,它也有外部存储,既然getExternalFilesDir(“”)和getExternalCacheDir()获取的是机身存储的外部存储部分,那么怎么获取SD卡的存储路径呢,还是通过上面提到的getExternalFilesDirs(Environment.MEDIA_MOUNTED)方法来获取了,不知道Android有没有提供相关的API接口来获取SD卡的存储路径,大家可以去查资料。又重复了上面的话,主要是提醒大家要注意不同的Android版本是有差别的,这个最坑了。 

    ………………………………………………………………………………………… 
    Environment.getDownloadCacheDirectory() = /cache 
    Environment.getRootDirectory() = /system 
    这两个方法没什么说的了,每个版本的android系统都一样 
    ………………………………………………………………………………………… 
    从上面我们很清楚的可以看到上面的方法可以分为三类,我用横线隔开了。第一类是位于根目录/data下;还有一类是位于根目录/storage下,可以看到调用它们的API方法都带了一个External;另外一类不在/data下也不再/storage下,比如系统文件/system,或者缓存文件/cache。 
    /data目录下的文件物理上存放在我们通常所说的内部存储里面 
    /storage目录下的文件物理上存放在我们通常所说的外部存储里面 
    /system用于存放系统文件,/cache用于存放一些缓存文件,物理上它们也是存放在内部存储里面的 


    下面来看一下大家常见的疑问 

    疑问1、那getFilesDir().getAbsolutePath()和getCacheDir().getAbsolutePath()有什么区别呢? 
    其实是没有什么区别的,我们可以看下面一张图: 
    这里写图片描述 
    getFilesDir获取的是files目录,getCacheDir获取的是cache目录,它们位于同一级目录,只是为了用来存放不同类型的数据的,由文件名不难看出:cache下存放缓存数据,databases下存放使用SQLite存储的数据,files下存放普通数据(log数据,json型数据等),shared_prefs下存放使用SharedPreference存放的数据。这些文件夹都是由系统创建的。 


    疑问2、getFilesDir().getAbsolutePath()和getExternalFilesDir(“”).getAbsolutePath()有什么区别呢? 

    我们先看它们的路径: 
    /data/user/0/packname/files 
    /storage/emulated/0/Android/data/packname/files 
    很显然这两个的区别是一个在内部存储里面,一个在外部存储里面,这是它们的区别。它们的共同点呢,就是它们的路径都带有包名,表明是这个APP的专属文件,这类文件应该是随着app卸载而一起被删除的,并且我们在设置里面清除该应用的数据时,这两个文件夹下的数据都会被清除。 
    疑问3、什么是APP专属文件? 
    上面疑问2我们提到了专属文件,所谓专属文件就是它是属于某个具体的应用的,他的文件路径都带有相应的包名,当APP卸载时,它们会随应用一起删除,当我们在设置里面手动清除某个应用数据时(不是清除缓存),它们也会一起被清掉。Android使用这种专属文件的目的就是为了方便文件管理,避免文件随意存储,显得很乱,另一个目的就是为了当应用被卸载时不会留下很多垃圾文件。 
    疑问4、既然内部存储与外部存储都有APP专属文件,那么我们该使用哪个呢? 

    内部存储与外部存储都有APP专属文件,我们该用哪个呢,很显然应该用外部存储的,因为内部存储本身就比较小,而且已经存储了一些系统的文件,因此内部存储我们尽量不要去使用。但是当手机没有外部存储时,我们还是得使用内部存储,一般程序员会做判断是否有外部存储,没有再使用内部存储,代码如下: 

    public static String getFilePath(Context context,String dir) {
        String directoryPath="";
        if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ) {//判断外部存储是否可用 
            directoryPath =context.getExternalFilesDir(dir).getAbsolutePath();
            }else{//没外部存储就使用内部存储  
            directoryPath=context.getFilesDir()+File.separator+dir;
            }
            File file = new File(directoryPath);
            if(!file.exists()){//判断文件目录是否存在
            file.mkdirs();
            }
        return directoryPath;
    }
    为了让大家更好地理解不同版本的Android系统的存储差异我做了下列一份说明表: 

    比较的是我向getFilesDir().getAbsolutePath()路径下和getExternalFilesDir(“”).getAbsolutePath()路径各写入19.48M数据前后的差别 
    表一、4.1.1系统,带有SD卡 (真机)

    存储位置获取路径的方法容量(写入前)容量(写入后)备注
    /data/data/packname/filesgetFilesDir()1.59GB1.57GB内部存储
    /storage/sdcard0/Android
    /data/packname/files
    getExternal
    StorageDirectory()
    1.47GB1.45GB外部存储(SD卡)

    表二、4.1.1系统,不带有SD卡 (真机)

    存储位置获取路径的方法容量(写入前)容量(写入后)备注
    /data/data/packname/filesgetFilesDir()1.59GB1.47GB内部存储
    路径不存在getExternal
    StorageDirectory()
    ~~~~~~没插SD卡

    表三、4.2.1系统,带有SD卡 (模拟器)

    存储位置获取路径的方法容量(写入前)容量(写入后)备注
    /data/data/packname/filesgetFilesDir()1.85GB1.83GB内部存储
    /mnt/sdcard/Android
    /data/packname/files
    getExternal
    StorageDirectory()
    98.42MB78.93MB外部存储(SD卡)

    表四、4.4.2系统,带有SD卡 (真机)

    存储位置获取路径的方法容量(写入前)容量(写入后)备注
    /data/data/packname/filesgetFilesDir()2.22GB2.18GB内部存储
    /storage/emulated/0/Android
    /data/packname/files
    getExternal
    StorageDirectory()
    2.20GB2.16GB机身外部存储
    /storage/sdcard1getExternalFilesDirs1.47GB1.47GB外部存储(SD卡
    没有向其写数据,只是读取)

    表五、4.4.2系统,不带有SD卡 (真机)

    存储位置获取路径的方法容量(写入前)容量(写入后)备注
    /data/data/packname/filesgetFilesDir()2.22GB2.18GB内部存储
    /storage/emulated/0/Android
    /data/packname/files
    getExternal
    StorageDirectory()
    2.20GB2.16GB机身外部存储

    表六、6.0.0系统,带有SD卡 (真机)

    存储位置获取路径的方法容量(写入前)容量(写入后)备注
    /data/user/0/packname/filesgetFilesDir()11.94GB11.90GB内部存储
    /storage/emulated/0/Android
    /data/packname/files
    getExternal
    StorageDirectory()
    11.92GB11.88GB机身外部存储
    /storage/B3E4-1711getExternalFilesDirs1.47GB1.47GB外部存储(SD卡)
    没有向其写数据,只是读取

    表七、6.0.0系统,不带有SD卡 (真机)

    存储位置获取路径的方法容量(写入前)/storage/容量(写入后)备注
    /data/user/0/packname/filesgetFilesDir()11.93GB11.89GB内部存储
    /storage/emulated/0/Android
    /data/packname/files
    getExternal
    StorageDirectory()
    11.91GB11.87GB机身外部存储

    注:上述容量指的是该路径所在根路径的可用容量,比如/data/data/packname/files的容量是指/data的可用容量,/storage/sdcard0/Android/data/packname/files指的是/storage/sdcard0的可用容量,而一般在4.4及以上的系统中,我们很少操作SD

    三、清除数据和清除缓存到底清除了什么数据

    这个很容易搞混,为什么呢?通过上面我们知道: 
    /data/user/0/packname/files它是用来存储普通数据的 
    /data/user/0/packname/cache它是用来存储缓存数据的 
    所以很多人就以为我清除数据时清除的肯定就是files下的数据,而我清除缓存数据时清除的肯定就是cache下的数据,但是事实却不是这样的。正确应该是: 
    清除缓存:我们知道应用程序在运行过程中需要经过很多过程,比如读入程序,计算,输入输出等等,这些过程中肯定会产生很多的数据,它们在内存中,以供程序运行时调用。所以清除缓存清除的是APP运行过程中所产生的临时数据。 
    清除数据:清除数据才是真正的删除了我们保存在文件中的数据(永久性数据,如果不人为删除的话会一直保存在文件中)例如当我们在设置里面清除了某个应用的数据,那么/data/user/0/packname/和/storage/emulated/0/Android/data/packname/下的文件里面的数据会全部删除,包括cache,files,lib,shared_prefs等等。

    四、/storage/sdcard,/sdcard,/mnt/sdcard,/storage/emulated/0之间的关系

    从上面的表中我们可以发现,在4.1系统中,getExternalStorageDirectory方法获取到的路径为/storage/sdcard0;4.2系统中getExternalStorageDirectory方法获取到的路径为/mnt/sdcard,因为4.2是模拟器打印的结果,如果是真机的话也是/storage/sdcard0;4.4的getExternalStorageDirectory方法获取到的路径为/storage/emulated/0,它的SD卡存储路径为/storage/sdcard1;6.0的getExternalStorageDirectory方法获取到的路径为/storage/emulated/0,它的SD卡存储路径为/storage/B3E4-1711;另外根据测试在4.0上getExternalStorageDirectory方法获取到的路径为/mnt/sdcard。所以在真机上,getExternalStorageDirectory获取到的路径如下表所示:

    系统版本结果
    4.0/mnt/sdcard
    4.1/storage/sdcard0
    4.2/storage/sdcard0
    4.4/storage/emulated/0
    6.0/storage/emulated/0

    要理解/storage/sdcard,/sdcard,/mnt/sdcard,/storage/emulated/0之间的关系,我们需要先要了解一下linux文件挂载的概念,关于挂载大家可以自行去百度。还有我们不明白为什么会有有/storage/sdcard,/sdcard,/mnt/sdcard,/storage/emulated/0这么多目录,让人看起来眼花缭乱,要详细了解请仔细看下面的文章,下面的文章是我摘自关于android的4.2的0文件夹的详解 
    —- android 4.0 —- 
    在galaxy nexus(GN)手机上userdata分区很大,被挂在/data目录,用户的数据通常是放在sd卡上,然而gn是没有sd卡的,所以google想了一个办法,就是虚拟一个。 
    所以,在userdata分区下有个目录叫media,是内置sd卡的数据存储位置,使用fuse技术将/data/media虚拟成为一个叫做/dev/fuse的设备,为了让程序能认出来,被同时挂载在 /mnt/sdcard 目录,又为了兼容以前的程序,做了一个快捷方式(linux系统里叫软连接) /sdcard 指向的是 /mnt/sdcard . 
    当然,这些都是4.0的做法。 
    —- android 4.1 —- 
    在4.1里,同样也会使用fuse技术,/dev/fuse 会被同时挂载到/storage/sdcard0 目录,这个sdcard0表示第一个sd卡(如果有外置sd卡,那会多一个 /storage/sdcard1,比如我的xoom), /sdcard 软连接会指向 /storage/sdcard0 ,此时/mnt/sdcard 也是个软连接,会指向/storage/sdcard0。 
    如果你通过otg线接U盘,会被挂载到 /storage/usb0目录,stickmount这个软件为了让图库、快图、mx player等软件,能看到u盘里的数据,又同时挂载到 /storage/sdcard0/usStorage/sda1. 
    也许你会问,为什么不是usb0,而是sda1,这是linux的对硬盘的命名方式,如果你的u盘有多个分区,就分别是sda1,sda2这样一直排下去了。 
    —- android 4.2 —- 
    好了,我们开始说4.2系统。 
    谷歌是不是没事干啊,非要给android搞个多用户,你想想啊,在中国,可能因为经济问题,家里不是每人一个电脑,在美国,几乎需要用电脑的人,都会自己有一台或多台,一台电脑多人用的情况少之又少,这就是为什么叫PC了,顾名思义,个人电脑。像手机和平板这些东西,更加私人化了,很少公用了吧,我想在中国也是如此吧。 
    当然,谷歌也不完全是抽风,因为他有更大的战略部署,而且平板也的确有多人用的可能。 
    所以谷歌搞出来一个多用户,那每个人的应用、数据、个性配置都要分开吧。 应用和个性配置好弄,想想啊,通过权限控制,每人只能看自己的应用就行了,桌面也可以用自己的。 
    那数据怎么办???? 
    好吧,调整用户数据的挂载结构。android 4.2,同样也会使用fuse技术/dev/fuse 会被挂载到/storage/emulated/0 目录,为什么是0呢,你还记得上边的sdcard0吧,第一个的意思。(如果有第二个,应该就是/storage/emulated/1,我们的三儿子没有外置sd卡,所以没法验证) 
    为了兼容以前,同时挂载到 /storage/emulated/legacy (故名思议,传统的),还建立三个软连接 /storage/sdcard0 ,/sdcard,/mnt/sdcard ,都指向 /storage/emulated/legacy 
    很多同学可能不会认真看上面,这里我就简单总结一下: 
    1、其中sdcard/、mnt/sdcard、storage/sdcard0、storage/emulated/0、storage/emulated/legacy都是同一个路径的不同”指针“,指向的是同一个地方,只是不同Android版本的叫法不一样。 
    2、如果大家想了解每个版本的外部存储路径,同学们可以通过获取getExternalStorageDirectory方法的打印结果进行对比

    五、一张图看懂Ram,Rom,以及扩展存储(TF卡)的区别;内部存储,外部存储的区别。

    这里写图片描述 
    1、首先我们来弄清几个概念,内存,内部存储,外部存储,机身存储(内置存储)。 
    1.1内存;我们在英文中称作memory,内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,所以说它是用于计算机运行时的,它不是用来存储数据的。 
    1.2内部存储,外部存储;内部存储我们称为InternalStorage,外部我们称为ExternalStorage,这两个概念来自于早期的Android智能机,4.4以前,内置存储就是内部存储,外置SD卡就是外置存储。我们通过getDataDirectory就可以获取内置存储根路径,通过getExternalStorageDirectory就可以获取外置SD卡根路径。4.4以后外部存储就包含两部分了,其中通过getExternalStorageDirectory获取的是机身存储的外部存储,而外置SD卡我们则需要通过getExternalDirs遍历来获取了。 
    1.3机身存储;机身存储是指手机自身携带的存储空间,出厂时就已经有了,4.4以前机身存储就是内部存储,4.4及以后机身存储包含了内部存储和外部存储。 
    2、Ram,Rom,以及扩展存储(TF卡)的概念。从图中我们可以看到,一个手机里面有内存,手机内置存储,以及SD卡, 它们分别是Ram,Rom,以及TF卡,这三种卡的性能,材质及价格都不一样,都有各自的用处。 
    3、内部存储,外部存储的概念。很多人对这个存在误解,认为机身存储就是内存,而SD卡才叫外部存储,这其实是不对的,不同的Android版本是有差别的,请看第1条。 
    最后附上我的例子: 

    http://download.csdn.net/download/u010937230/9930396

    原文连接:https://blog.csdn.net/u010937230/article/details/73303034


    展开全文
  • 分布式文件存储系统架构和原理

    千次阅读 2019-02-22 16:33:19
    架构  如上图所示,HDFS也是按照Master和Slave的结构。分NameNode、SecondaryNameNode、DataNode这几个角色。  NameNode:是Master节点,是大领导。管理数据块映射;处理客户端的读写请求;配置副本策略;管理...
  • HDFS文件目录结构详解

    千次阅读 2018-09-26 10:15:02
    HDFS metadata以树状结构存储...本文基于Hadoop2.6版本介绍HDFS Namenode本地目录存储结构和Datanode数据块存储目录结构,也就是hdfs-site.xml中配置的dfs.namenode.name.dir和dfs.datanode.data.dir。   一、...
  • Android应用的文件存储目录使用

    千次阅读 2018-03-23 17:18:25
     来源 阅 379 转 4转藏到我的图书馆微信分享:了解 Android 应用的文件存储目录,掌握持久化数据的正确姿势本文导读:在安卓手机上,安装或者卸载一个 App,会涉及到本地存储系统的哪些目录结构变化?...
  • 本文按照自己的理解从硬件磁盘到文件系统的逐层网上的思路开展,从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。
  • 程序读取出来的文件目录结构想通过数据库存入缓存,有没有人做过类似的功能实现,比如用mysql这种如果存储c盘下的所有文件名并保留目录结构?求版主大大不要移动我的贴子到数据库,我只认得混迹c/c++板块的同僚。...
  • 大部分的Linux文件系统(如ext2、ext3)规定,一个文件目录项、inode和数据块组成: 目录项:包括文件名和inode节点号。Inode:又称文件索引节点,包含文件的基础信息以及数据块的指针。数据块:包含文件的具体...
  • 今天对比一下mysql两种常用存储引擎myisam和innodb的文件存储结构: 先说一下两者的大概区别: myisam 更适合读取大于写入的业务,同时不支持事物。 innodb 支持事物,效率上比myisam稍慢。文件存储:myism物理...
  • WorldWind文件分片及存储目录说明

    千次阅读 2017-08-20 17:48:05
    本文记述了WordWind文件分片依据及存储目录规则。
  • 文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件目录、软连接及文件保护信息等都存储在其中。 不同Linux发行版本之间的文件系统差别很少,主要表现在系统管理的特色工具...
  • 【Linux】Linux文件文件存储

    万次阅读 2018-07-31 18:39:51
    从使用和创建文件的用户角度来看,文件是磁盘的最小存储单元,用户数据除非在文件中,否则不能保存到磁盘;从进程的角度来看,文件是一种进程可以对它进行访问的,但独立于进程而存在的数据结构文件中的信息不会因...
  • Maven项目编译后文件目录结构

    千次阅读 2018-11-09 13:29:23
    去找编译后文件目录,先去编译后项目存储地址 workspace对应的盘:\workspace的位置\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\项目名   META-INF:相当于一个信息包,目录中的文件和...
  • 由存储在磁盘的操作系统文件组成,这些文件主要是数据文件(*.dbf),控制文件(*.ctl),重做日志文件(*.log)2:逻辑存储结构一物理存储结构 数据文件 存储数据库数据的文件。例如表和视图1读取频繁访问的数据 ...
  • Innodb、MYISAM的文件存储结构

    千次阅读 2017-06-09 10:43:38
    MySQL的每个数据库都对应存放在一个与数据库同名的文件夹中,MySQL数据库文件....frm文件存储数据表的框架结构,文件名与表名相同,每个表对应一个同名frm文件,与操作系统和存储引擎无关,即不管MySQL运行在何种操
  • 块存储和文件存储是我们比较熟悉的两种主流的存储类型,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)简称OSD。  首先,...
  • 数据库系统概念:存储文件结构

    千次阅读 2019-03-21 15:46:07
    文章目录1、基本概念2、文件组织2.1 定长记录2.2 变长记录2.3 文件中记录的组织3 缓冲区 1、基本概念 1、内存数据库与磁盘数据库的特征比较 内存数据库 磁盘数据库 存取时间 10−810^{-8}10−8s 量级 10−...
  • 从本篇文章开始介绍一款现在非常火的分布式文件系统Ceph,包括这款文件系统的安装、基本使用场景、常用管理命令和重要工作原理。特别是讨论了PaxOS算法的基本理后,就更容易理解Ceph分布式文件系统中各种角色的工作...
  • 对公布式文件存储系统seaweedfs的使用详细说明,以及一些架构说明,可以用于存储图片, 视频,文档等内容
  • 文件系统和目录结构

    千次阅读 2018-09-14 16:22:54
      Linux以文件的形式对...而这些种类繁多的文件被Linux使用目录树进行管理, 所谓的目录树就是以根目录(/)为主,向下呈现分支状的一种文件结构。不同于纯粹的ext2之类的文件系统,我把它称为文件体系,一切...
  • SQL SERVER2005物理结构之文件组成和存储结构
  • 盘点分布式文件存储系统

    千次阅读 2021-02-08 22:14:23
    在项目的数据存储中,结构化数据通常采用关系型数据库,非结构化数据(文件)的存储就有很多种方式,服务器本地存储、Nas挂载、ftp等等,今天就来盘点一下,分布式文件存储系统。
  • Android中的文件读写操作是不可或缺的,每个应用都会...Android内部存储文件的读写 Android外部存储文件的读写 一、读取assets文件夹中的数据 assets文件夹 和 res文件夹 的区别: Android系统不为ass
  • 操作系统 文件的物理结构文件目录 先来说一下文件文件目录。当我们建立一个文件之后,操作系统会给我们生成对应的记录文件信息的文件(记录文件) 的文件名,文件的类型,文件大小,文件访问权限等属性和文件的...
  • refer to ...文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,369,174
精华内容 547,669
关键字:

常用的文件目录存储结构