操纵可能正在使用的NTFS符号链接

时间:2017-12-13 09:13:59

标签: python windows symlink ntfs

很久很久以前,我有了一个顿悟。在我的工作过程中,我每天创建几个或多或少的临时文件。其中一些对于存储更长时间是有用的,有些则不是。由于这些文件的数量,我认为每天将它们组织到文件夹中将是一件好事。所以我创建了一个计划任务,每晚运行一个脚本,为每个工作日创建一个新文件夹,如果它们是空的,则删除旧文件夹。

一段时间以来一切都很好,但后来我开始想知道如果我可以通过一些快捷方式访问今天文件夹,那就太方便了,比如 C:\ today < / em>或类似的东西。在兔子洞下面我们去......

所以我修改了我的脚本来创建一个NTFS符号链接(是的,这样的东西存在!)从C:\today到例如C:\Users\<me>\Documents\dayfolders\2017-12-01\

现在,当我离开工作岗位时,我并没有仔细地关闭我碰巧使用的每个程序中的每个文件(所以第二天早上我可以从我离开的地方拿起)。这会影响我的花式符号,因为当某些内容仍在使用它时我无法删除符号链接。所以,我想,我将重命名符号链接到临时目录中的临时内容,然后使用旧名称创建一个新的符号链接。 此策略仅适用于第一次(或两次)。到目前为止,我只是和它一起生活过,但我仍然觉得 MAY 可以成为一条出路!

如果有人可以帮助我,请做! :)

所以,我计划任务的代码(Python 3):

if __name__ == '__main__':
   # some setup tasks here for logging, loading conf etc

   basepath = getbasepath(conf)
   cleanupolddirs(basepath)

   newdir = createnewdir(basepath)
   relink(conf, newdir)

   # post-run cleanup tasks here

从上到下,其余的相关功能:

def getbasepath(config):
    basepath_ = config['General']['BasePath']
    if (len(basepath_) == 0) or (not os.path.exists(basepath_)):
        basepathmsg = "Error with base path. Provided path was: %s" % str(basepath_)
        logging.fatal(basepathmsg)
        logging.shutdown()
        sys.exit(basepathmsg)
    return basepath_

删除空目录:

def cleanupolddirs(base):
    for d in os.listdir(base):
        try:
            wd = os.path.join(base, d)
            mode = os.stat(wd).st_mode
            if stat.S_ISDIR(mode) and not stat.S_ISLNK(mode):
                subs = os.listdir(wd)
                if len(subs) == 0:
                    logging.debug('empty dir')
                    os.rmdir(wd)
        except Exception as e:
            logging.error("FNFE:" + str(e))

现在我们开始了实际的业务。首先,为链接创建一个目标目录,指向:

def createnewdir(base):
    freshdir = os.path.join(base, str(date.today()))
    if not os.path.exists(freshdir):
        try:
            os.mkdir(freshdir)
        except Exception as e:
            logging.error("New daydir error:" + str(freshdir) + "; " + str(e))

    return freshdir

现在是麻烦的部分 - 将当前链接重命名为temp中的某些内容并创建一个新链接:

def relink(config, target):
    links = config.items('LinkPaths')
    tempdir = tempfile.mkdtemp()
    # create a link to new daydir
    for linkname, linkpath in links:
        if os.path.exists(linkpath):
            temppath = os.path.join(tempdir, os.path.basename(linkname) + str(date.today()))
            logging.info('temp path for {link} is {path}'.format(link=linkpath, path=temppath))
            try:
                os.rename(linkpath, temppath)
            except OSError as e:
                logging.error('Error renaming link ({link}): {err}'.format(link=linkpath, err=e))
            try:
                os.unlink(temppath)
            except OSError as e:
                logging.error('Error deleting temp link ({link}): {err}'.format(link=temppath, err=e))

        try:
            os.symlink(target, linkpath)
        except OSError as err:
            logging.error("Error creating/updating link ({link}): {err}".format(link=linkpath, err=err))

    try:
        shutil.rmtree(tempdir)
    except Exception as err:
        logging.error("Error removing temporary directory ({dir}): {err}".format(dir=tempdir, err=err))

和说明结果的尝试的日志文件。我从一个&#34; clean&#34;开始符号链接不存在的状态。从日志消息中可以看出,我实际上试图保留两个链接 - 一个直接位于C:\下,另一个位于我的个人资料目录中。

2017-12-01 01:00:01,528 - INFO - temp path for C:\today is C:\Users\<me>\AppData\Local\Temp\tmpltsvanzn\path12017-12-01
2017-12-01 01:00:01,573 - INFO - temp path for C:\Users\<me>\Documents\dayfolders\today is C:\Users\<me>\AppData\Local\Temp\tmpltsvanzn\path22017-12-01
2017-12-02 01:00:01,460 - INFO - temp path for C:\today is C:\Users\<me>\AppData\Local\Temp\tmpom8kry8p\path12017-12-02
2017-12-02 01:00:01,485 - INFO - temp path for C:\Users\<me>\Documents\dayfolders\today is C:\Users\<me>\AppData\Local\Temp\tmpom8kry8p\path22017-12-02
2017-12-03 01:00:01,454 - ERROR - FNFE:[WinError 5] Access is denied: 'C:\\Users\\<me>\\Documents\\dayfolders\\today'
2017-12-03 01:00:01,484 - ERROR - Error creating/updating link (C:\today): [WinError 183] Cannot create a file when that file already exists: 'C:\\Users\\<me>\\Documents\\dayfolders\\2017-12-03' -> 'C:\\today'
2017-12-03 01:00:01,484 - ERROR - Error creating/updating link (C:\Users\<me>\Documents\dayfolders\today): [WinError 183] Cannot create a file when that file already exists: 'C:\\Users\\<me>\\Documents\\dayfolders\\2017-12-03' -> 'C:\\Users\\<me>\\Documents\\dayfolders\\today'

并且在接下来的每一天都会记录与12月3日相同的错误。

任务以我的用户身份运行,并且&#34;以最高权限运行&#34;复选框已选中。该任务也设置为&#34;运行用户是否登录&#34;。

我觉得有一些非常基本的干扰我征服世界的计划,但对于我的生活,我看不到木头的树木。

0 个答案:

没有答案