LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: jhuangjiahua

请问如何得到文件的绝对路径

[复制链接]
发表于 2006-10-18 22:58:02 | 显示全部楼层
之前一直在想这个问题,包括如何在c里面实现,而且需要输出不带.和..之类的可读性较强的路径(要给人看的,如/aaaa/bbbb/../ccc/./ddd之类的不行,虽然还是可以正常工作),好像shell里面好实现一点
目录可以这样:ABS_PATH=`cd $DIRNAME; pwd`
文件可能要判断一下:
if [ -d $DIRNAME ]; then
ABS_PATH=`cd $DIRNAME; pwd`
else
TMPDIR=`dirname $DIRNAME`
TMPFILE=`basename $DIRNAME`
ABS_PATH=`cd $TMPDIR; pwd`"/"$TMPFILE
fi
有点冗长,而且该目录至少要有rx权限,不知道大家有没有更好的方法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-19 07:32:03 | 显示全部楼层
1. 判断第一个字符是不是 /
2. 去掉
//
/./
3. 处理掉 /../
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-19 07:44:13 | 显示全部楼层
贴一下纯 python 的,

pandazxx 改成 C 就是。
  1. ## 是否 / 开头
  2. def isabs(s):
  3.     """Test whether a path is absolute"""
  4.     return s.startswith('/')
  5. ## 连接路径
  6. def join(a, *p):
  7.     """Join two or more pathname components, inserting '/' as needed"""
  8.     path = a
  9.     for b in p:
  10.         if b.startswith('/'):
  11.             path = b
  12.         elif path == '' or path.endswith('/'):
  13.             path +=  b
  14.         else:
  15.             path += '/' + b
  16.     return path
  17. ## 分割路径
  18. def split(p):
  19.     """Split a pathname.  Returns tuple "(head, tail)" where "tail" is
  20.     everything after the final slash.  Either part may be empty."""
  21.     i = p.rfind('/') + 1
  22.     head, tail = p[:i], p[i:]
  23.     if head and head != '/'*len(head):
  24.         head = head.rstrip('/')
  25.     return head, tail
  26. ## 去掉 // , /./ , /../ 之类
  27. def normpath(path):
  28.     """Normalize path, eliminating double slashes, etc."""
  29.     if path == '':
  30.         return '.'
  31.     initial_slashes = path.startswith('/')
  32.     # POSIX allows one or two initial slashes, but treats three or more
  33.     # as single slash.
  34.     if (initial_slashes and
  35.         path.startswith('//') and not path.startswith('///')):
  36.         initial_slashes = 2
  37.     comps = path.split('/')
  38.     new_comps = []
  39.     for comp in comps:
  40.         if comp in ('', '.'):
  41.             continue
  42.         if (comp != '..' or (not initial_slashes and not new_comps) or
  43.              (new_comps and new_comps[-1] == '..')):
  44.             new_comps.append(comp)
  45.         elif new_comps:
  46.             new_comps.pop()
  47.     comps = new_comps
  48.     path = '/'.join(comps)
  49.     if initial_slashes:
  50.         path = '/'*initial_slashes + path
  51.     return path or '.'
  52. ## 绝对路径
  53. def abspath(path):
  54.     """Return an absolute path."""
  55.     if not isabs(path):
  56.         path = join(os.getcwd(), path)
  57.     return normpath(path)
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-10-19 12:48:46 | 显示全部楼层
谢谢,但是我觉得为什么这样的功能不能做到库里面去呢?在shell中好像也没有简单的实现方法,但是bash的自动完成目录的功能是可以把相对路径展开成可读的绝对路径的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-19 19:47:29 | 显示全部楼层
鬼知道…………
回复 支持 反对

使用道具 举报

发表于 2006-10-19 22:07:31 | 显示全部楼层
python中获取argv[1]的绝对路径不是可以

  1. import os, sys

  2. print "The full path of",sys.argv[1],"is",os.path.abspath(sys.argv[1])
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-20 00:49:51 | 显示全部楼层
pandazxx 说的是 C 和 bash
回复 支持 反对

使用道具 举报

发表于 2006-10-20 13:09:18 | 显示全部楼层
我觉得python这种解决方法才是王道,这种东西应该放在就库里面,个人实现麻烦不说了,还容易出bug
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表