背景:例如百度云存储的路径是 /Users/Biao/Baidu/百度云同步盘,路径中有中文字符。
有一个 Qt 工程叫 QtTest 存储在 百度云同步盘 里面: /Users/Biao/Baidu/百度云同步盘/QtTest
因为 Qt 工程 QtTest 的路径中有中文字符,所以 QtCreator 是不能编译这个 Qt 工程的。
于是我们就想把这个含有中文的路径映射到一个没有中文的路径,例如 /Users/Biao/BaiduYun,
修改这两个目录中的任何一个目录里的数据,另一个目录会自动同步,但是路径却不一样。
很多不支持路径中有中文的软件也可以使用此方法解决。
如果在 Linux 上则很好解决,使用 mount --bind source_directory destination_directory 则就完成了。
但是在 Mac 上却不支持这个命令,不过我们可以用下面两个小程序来创建和删除文件夹的硬链接。
一、创建文件夹的硬链接
#include
#include
// Build: gcc -o hlink hlink.c -Wall
int main(int argc, char *argv[]) {
printf("Usage: assume the program name is hlink\n");
printf("sudo ./hlink source_directory destination_directory\n");
if (argc != 3) return 1;
int ret = link(argv[1], argv[2]);
if (ret == 0) {
printf("\n");
printf("****** Create hard link successful ******\n");
} else {
perror("link");
}
return ret;
}
1. 在终端里使用命令编译程序,生成可执行文件 hlink:
gcc -o hlink hlink.c -Wall
2. 创建 /Users/Biao/Baidu/百度云同步盘 的硬链接 /Users/Biao/BaiduYun
(首先BaiduYun这个目录是不存在的,是在执行下面创建硬链接的命令后自动生成的)
./hlink /Users/Biao/Baidu/百度云同步盘 /Users/Biao/BaiduYun
二、删除文件夹的硬链接
#include
// Build: gcc -o hunlink hunlink.c
int main(int argc, char *argv[]) {
printf("Usage: assume the program name is hunlink\n");
printf("sudo ./hunlink destination_directory\n");
if (argc != 2) return 1;
int ret = unlink(argv[1]);
if (ret == 0) {
printf("\n");
printf("****** Delete hard link successful ******\n");
} else {
perror("unlink");
}
return ret;
}
1. 在终端里使用命令编译程序,生成可执行文件 hunlink:
gcc -o hunlink hunlink.c
2. 删除 /Users/Biao/Baidu/百度云同步盘 的硬链 /Users/Biao/BaiduYun
(注意,这里的参数是/Users/Biao/BaiduYun,而不是源文件夹 /Users/Biao/Baidu/百度云同步盘)
./hunlink /Users/Biao/BaiduYun
本主题由 qsd4014 于 2013-9-10 07:58 审核通过
对jorneyr于2013-09-09 22:56:33在楼主发表的内容评分:人气:+1;
本帖最后由 qsd4014 于 2013-9-10 08:19 编辑
背景:例如百度云存储的路径是 /Users/Biao/Baidu/百度云同步盘,路径中有中文字符。
有一个 Qt 工程叫 QtTest 存储在 百度云同步盘 里面: /Users……发米有你更精彩:)
感谢分享^_^
这个是不是有点太复杂..
谢谢了,!!
不明觉厉
ninan 发表于 2013-9-10 09:45
这个是不是有点太复杂..
相对来说是比较复杂的,需要对编程有一点的基础。
有时间的时候可以弄个有界面的程序出来,那样就方便了。
jorneyr 发表于 2013-9-10 11:00
相对来说是比较复杂的,需要对编程有一点的基础。
有时间的时候可以弄个有界面的程序出来,那样就方便了 ...
难道不能直接去百度盘设置另外一个文件夹同步来实现么?或者,用ln命令直接链接另外一个文件夹呢?
弱弱的问一句,ln (硬连接)或者ln -s(软连接)和你这个有什么区别吗?
不用编程直接使用就行啊。为什么不用呢?
而且,说到界面,写一个脚本,直接放到桌面,也可以达到目的吧?
9楼说的很对啊,ln就可以解决的事为啥要那么复杂去编程啊
eddy16112 发表于 2013-9-10 11:19
9楼说的很对啊,ln就可以解决的事为啥要那么复杂去编程啊
555,我在8楼也说过了呀
同意9楼
ninan 发表于 2013-9-10 11:21
555,我在8楼也说过了呀
滚屏滚的太快了。。。略过了
ninan 发表于 2013-9-10 11:01
难道不能直接去百度盘设置另外一个文件夹同步来实现么?或者,用ln命令直接链接另外一个文件夹呢? ...
1. 不能在命令行里给文件夹创建硬链接。
2. 软链接解决不了这个问题,因为里面文件的路径实际上没有改变。
实际路径没变没错,但是你引用的时候,只需要引用链接就可以了呀,不也能避开中文么。不是很懂,其实,就是问问。
rollerdude 发表于 2013-9-10 11:08
弱弱的问一句,ln (硬连接)或者ln -s(软连接)和你这个有什么区别吗?
不用编程直接使用就行啊。为什么 ...
给你举个例子吧
我们有一个文件为 /User/Biao/Document/你好.txt
1. 创建软链接
ln -s /User/Biao/Document/你好.txt /hello.txt
打开hello.txt,则路径还是/User/Biao/Document/你好.txt
不支持路径中有中文字符的软件仍然打不开这个文件,所以问题没有解决。
2. 创建硬链接
ln /User/Biao/Document/你好.txt /hello.txt
打开hello.txt,则路径变为了/hello.txt
虽然他们的路径不同,但是它们还是指向同一个文件.
这就解决了把一个路径中有特殊字符的路径映射到一个全是英文的路径上,但是仍然是指向同一个文件。
可是Mac的终端里是不允许给一个文件夹创建硬链接的。
这也是为什么要写程序来实现。
可以再复杂点嘛?
jorneyr 发表于 2013-9-10 11:41
给你举个例子吧
我们有一个文件为 /User/Biao/Document/你好.txt
我刚才实验了一下。我的系统是10.9 DP7。结果如下。
用ln -s创建了一个对于百度网盘文件夹的一个软连接。ls -l显示如下:
lrwxr-xr-x 1 ************ 409 10 12:12 baidu -> ./Downloads/BaiduPan/百度云同步盘/
然后我cd进入到baidu这个文件夹。shell显示是baidu,而不是中文字符。
屏幕快照 2013-09-10 12.15.42.png (30.56 KB, 下载次数: 0)
下载附件
2013-9-10 12:20 上传
我查了一下。硬连接也可以创建,只不过有比较多的限制。我就懒得实验了。
jorneyr 发表于 2013-9-10 11:41
给你举个例子吧
我们有一个文件为 /User/Biao/Document/你好.txt
你说的单是一个路径问题啊,并没有涉及到文件问题。
假如说文件本身是有中文的,那我们需要另外来讨论。
ninan 发表于 2013-9-10 12:36
你说的单是一个路径问题啊,并没有涉及到文件问题。
假如说文件本身是有中文的,那我们需要另外来讨论。 ...
可能是有些情况你没见过。
例如Qt工程的路径如果有中文,QtCreator就不能编译这个工程,这样的软件有不少。
rollerdude 发表于 2013-9-10 12:22
我刚才实验了一下。我的系统是10.9 DP7。结果如下。
用ln -s创建了一个对于百度网盘文件夹的一个软连接。 ...
呵呵,给文件夹做硬链接Mac默认是禁止的,但是可以一些第三方方案,例如用port安装bindfs。
这个问题在StackOverflow讨论过很多,尤其是搞编程的人遇到这样的情况相对较多,不防去多学习学习吧,现实没你想的那么简单。
好东西一定要顶
感谢分享^_^
技术贴 mark一下
有代码的我都不敢看,代码是我的硬伤
jorneyr 发表于 2013-9-10 17:21
呵呵,给文件夹做硬链接Mac默认是禁止的,但是可以一些第三方方案,例如用port安装bindfs。
这个问题在St ...
哈哈,你做连接不就是因为中文在路径中不被程序支持么。
我已经演示了,软连接过去的文件夹并不存在任何中文路径。而且,对于读写文件来说,系统都是透明支持软连接的。你的程序连这种透明支持都无能的话,我也只能哈哈了。
stackoverflow好像就是真理王国一样。
现实很复杂,也很简单。
9楼说的对,如果用linux编程,怎能不知道ln回9楼eddy16112于9 小时前发表的: 9楼说的很对啊,ln就可以解决的事为啥要那么复杂去编程啊
rollerdude 发表于 2013-9-10 20:44
哈哈,你做连接不就是因为中文在路径中不被程序支持么。
我已经演示了,软连接过去的文件夹并不存在任何 ...而且,对于读写文件来说,系统都是透明支持软连接的。
好吧,在给你普及一下。
"你好" 是源文件夹,"x" 是 "你好" 的软链接,如图,
1. 先进入软链接的文件夹 "x".
2. open new.txt 调用系统的TextEdit打开new.txt
3. 在TextEdit的标题处右键,弹出的菜单显示出new.txt的真实路径。
1.png (50.24 KB, 下载次数: 0)
下载附件
2013-9-10 20:56 上传
2.png (68.31 KB, 下载次数: 0)
下载附件
2013-9-10 20:56 上传
3.png (42.24 KB, 下载次数: 0)
下载附件
2013-9-10 20:57 上传
虽不明,但觉厉..
SidShann 发表于 2013-9-10 20:55
9楼说的对,如果用linux编程,怎能不知道ln
只能说,你们对硬链接,软件链接的区别并不清楚。
如果想了解更多,网上有很多这方面的资料。
纯粹的技术贴啊
jorneyr 发表于 2013-9-10 20:58
而且,对于读写文件来说,系统都是透明支持软连接的。
好吧,在给你普及一下。
Mac系统的读写调用并不区分这些的。
就怕是软件在读的过程中,转换了这个软连接为原生路径(或者文件名)。这样的话,如果软件不支持unicode,后续的读写确实会存在问题。
在C里面,不对路径进行转换的话,不需要显式的支持unicode,就可以通过软连接来读写文件的。当然,读写的内容必须只能是非Unicode的东西了。
rollerdude 发表于 2013-9-10 21:31
Mac系统的读写调用并不区分这些的。
就怕是软件在读的过程中,转换了这个软连接为原生路径(或者文件名) ...
Mac系统的读写调用并不区分这些的。
系统支持有中文字符的路径没有任何问题。
就怕是软件在读的过程中,转换了这个软连接为原生路径(或者文件名)。这样的话,如果软件不支持unicode,后续的读写确实会存在问题。
软链接并不会改变文件的路径,只是路径的一个快捷方式。
所以点击软链接打开文件,在软件里文件的路径仍然是它的真实路径,与软链接没有任何关系。
在C里面,不对路径进行转换的话,不需要显式的支持unicode,就可以通过软连接来读写文件的。当然,读写的内容必须只能是非Unicode的东西了。
文件路径中有中文与文中有中文完全不是一回事,他们之关没有任何关系。
而且,世界上除了 Unicode,ISO-8859-1, Latin1等编码外,还有各种各样的编码。
读写的内容必须只能是非Unicode的东西了。
呵呵,找个渣,如果是GB18030的编码呢?
为什么要这么做,楼主说的并不简单易懂。
很多网友甚至连最近的网盘大战都还不知道。
jorneyr 发表于 2013-9-10 21:38
Mac系统的读写调用并不区分这些的。
系统支持有中文字符的路径没有任何问题。
我只能说,什么都不是完美的。
虽然软链接只是一个快捷方式,但对于底层文件访问来说,由于系统的支持,通常是没有问题的。
我只是说的访问到文件,如果读写的内容编码都是不支持的,那没有什么好说的。你用什么连接过去,都是不可能改变的。
我要软连接百度网盘文件夹只是因为终端访问输入中文太麻烦了。对于我来说,只要连接过去了,随便它路径发生变化还是不发生变化,我能读写文件就好了。
硬连接使用太少了,因为系统的透明支持使得很多时候软连接有很好的优势,比如跨文件系统。
你说的方法使用的情况应该是比较特殊的,对于普通用户,软连接神马的就足够了。
rollerdude 发表于 2013-9-10 22:09
我只能说,什么都不是完美的。
虽然软链接只是一个快捷方式,但对于底层文件访问来说,由于系统的支持, ...
是的,需要这么做的情况不多,但是这个问题确实存在,坛里就有兄弟也同样遇到了。
昨night 发表于 2013-9-10 21:51
为什么要这么做,楼主说的并不简单易懂。
很多网友甚至连最近的网盘大战都还不知道。 ...
通常不用管这个百度云的客户端制造的中文名字的文件夹名字。
一般字处理软件,浏览器神马的都应该是没有问题。
只是很少的情况,比如终端访问那个文件夹,或者支持中文不怎么好或者完全不支持的软件访问那个文件夹才需要特别处理。
其实,实在软件对于中文路径有问题,用Dropbox好了。速度也不错,就是只有2G免费空间。
我居然。。link: Operation not permitted
本文介绍了如何在Mac上解决Qt工程因路径包含中文字符导致的编译问题。通过编写两个小程序创建和删除文件夹的硬链接,将含有中文的百度云同步盘路径映射到一个无中文的路径,实现QtCreator的正常编译。该方法适用于不支持路径有中文的软件,提供了解决类似问题的思路。
6001

被折叠的 条评论
为什么被折叠?



