下载保存文件到手机本地前, 优先选择位置的一个取巧方法

本文介绍了一种手机存储管理的方法:通过判断是否有外置内存卡来决定文件保存位置,并提供了一个取巧的方案来找到内置存储路径,以充分利用手机存储空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在的手机内存动辄内置了8G, 16G, 甚至32G的存储空间, 其实已经够用了. 当然如果手机支持插外置内存卡, 比如手机再插入个32G的内存卡. 那手机容量就大大增加了. 应用在下载保存文件时, 比如像UC浏览器那种, 它会询问诱导用户设置一个默认的保存路径. 一般我们会优先将文件保存在外置内存卡中(如果有的话) , 若没有外置存储的内存卡, 才把这些文件图片什么的 放到内置存储的空间去, 这样才能最大限度的不浪费手机内置的存储空间. 

于是, 我就有了以下的一个取巧方法, 思路大概是这样的 : 下载文件前, 先利用Environment去判断是否有外置内存卡, 如果有就将文件保存至外置内存卡中(当然更谨慎的思路是, 还要计算出该内存卡的剩余空用空间, 如果大于文件的大小 就进行保存操作, 否则提示用户内存不足BLABLABLA的. 后面同理, 我就不再提这点了.).  如果没有内存卡, 就保存至本地存储空间.  

但这里有一个问题, 就是保存至本地存储空间时, 我们并不像保存至外置存储卡那么方便, 直接用一个Environment.getExternalStorageDirectory().getAbsolutePath()就搞掂. 保存至本地中还需要提前获知这个路径, 而这个路径根据不同的手机有的是/mnt/sdcard1/ , 有的是/mnt/sdcard2/ 等等. So 怎么取巧呢? 直接看代码.

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
					//有内存卡, 进行相应操作
				}else{	
					File[] files = new File("/mnt/").listFiles();
					if(files.length > 0){
						String filePath = null;
						for(int p=0;p<files.length;p++){
							if(files[p].isDirectory()){
								if(files[p].getPath().indexOf("sdcard") > 0){	//路径名包含"sdcard"这个关键字
									StatFs st = new StatFs(files[p].getPath());
									int blocksize = st.getBlockSize();	
									int blockcount = st.getBlockCount();
									if((blocksize * blockcount) > 0){
										filePath = files[p].getPath();
									}
								}
								
							}
						}
						if(filePath != null){
							//找出本地存储的路径, 进行相应操作
						}
					}
				}

上面的方法, 可以在进行保存操作前, 先用来找出保存的路径. 主要是方便当不存在外置存储卡时 , 分配给外置存储的block数就为0,大小也当然为0. 于是能比较快的找出内置存储(不为0)的路径.当然, 假定了内置存储的路径名包含了"sdcard"这个关键字, 这是取巧的方法, 但也足以应对绝大多数的手机了.






<think>嗯,用户遇到了Git标签操作中的错误提示“无法解析'head'为一个有效引用”。这个错误通常发生在初始化仓库后立即尝试打标签时,因为此时仓库里还没有任何提交记录,HEAD引用是无效的。用户可能刚创建了一个全新的Git仓库,或者清空了现有仓库的历史记录。ta急着给项目打版本标签,但忽略了必须有提交才能创建标签这个提条件。从错误描述看,用户应该是在命令行直接执行了类似gittagv1.0这样的命令。根据Git的工作原理,HEAD文件通常指向当分支的最近提交。当仓库为空时,.git/HEAD文件虽然存在,但里面只有一个初始化的ref:refs/heads/main字符串,并没有具体的提交哈希值。这时任何依赖提交历史的操作都会失败。解决思路很清晰:首用gitstatus确认仓库状态(引用1展示的状态报告很典型)。如果确实没有提交,就需要立即创建初始提交。哪怕只是创建一个空提交(gitcommit--allow-empty)也能建立初始的HEAD指向。这里有个细节值得注意:用户可能担心空提交会影响项目。可以补充说明这种初始提交不会产生实质影响,后续正常开发后,这个空提交会被淹没在历史中。另外也要提醒分支保护问题——有些仓库配置了禁止强制推送,这时候可能需要临时解除保护。回复中特意提到--allow-empty选项和远程仓库权限,是因为考虑到用户可能是自动化脚本执行失败,或者仓库有严格的CI/CD规则。最后用步骤列表呈现解决方案是为了让用户能快速操作,特别是标记了关键命令为代码块,方便复制粘贴。那个创建空提交的方案可能有点取巧,但确实解决这类问题最快捷的方法。最后强调添加真实文件是为了覆盖实际开发场景——毕竟大多数用户创建空仓库后,总归是要添加真实文件的。</think> 这个错误通常发生在**新创建的Git仓库中尚未有任何提交时**,即HEAD引用指向的对象尚未生成。以下是完整的解决方案: ### 解决方案步骤 1. **检查仓库状态** ```bash git status ``` - 若输出 `位于分支 main` + `尚无提交`(类似提示),说明仓库为空 - 若输出 `Your branch is ahead of...`(引用[2]),说明已有提交,需排查其他问题 2. **创建初始提交(解决根本问题)** ```bash # 创建空文件保持仓库清洁 touch README.md git add README.md git commit -m "初始提交" ``` 3. **重新创建标签** ```bash git tag v1.0 # 成功执行 ``` ### 核心原理 - Git标签必须关联具体提交对象 - HEAD在空仓库中指向`refs/heads/main`,但该引用未实例化(如图示) ``` .git/HEAD └── ref: refs/heads/main # 但该分支文件不存在 ``` - 首次提交后Git才会生成`refs/heads/main`文件和实际提交对象 ### 特殊情况处理 若已有提交仍报错: ```bash # 强制重建HEAD引用 git symbolic-ref HEAD refs/heads/main # 验证引用有效性 git rev-parse HEAD ``` > **重要提示**:空仓库直接打标签是无效操作。所有有效标签必须关联到具体的Git提交对象[^1]。 --- ### 相关问题 1. 如何在Git中创建带注释的标签? `git tag -a v1.1 -m "Release version 1.1"` 2. 如何将本地标签推送到远程仓库? `git push origin <tagname>` 或全部推送 `git push --tags` 3. HEAD与标签有什么区别? HEAD始终指向当分支最新提交,标签是静态的指向特定提交的指针[^2]。 4. 删除无效标签的命令是什么? 本地删除 `git tag -d v0.9`,远程删除 `git push origin --delete v0.9` > 参考实践:首次提交建议至少包含README.md和.gitignore文件建立仓库基础结构[^1][^2]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值