在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
12
返回列表 发新帖
楼主: YuSHL

[求助] 获取当前脚本的绝对路径

[复制链接]
发表于 2023-9-11 20:28:13 | 显示全部楼层


YuSHL 发表于 2023-9-11 17:20
我用了大佬ycGetFileName()那几个相关的函数,当两个不同路径下都存在同样的.il文件时,获取的路径不对
...


最好是能描述一下你的使用场景,不然不好猜哪里有问题。


下面是一个简单的例子:


                               
登录/注册后可看大图


 楼主| 发表于 2023-9-12 08:36:09 | 显示全部楼层


yangqi666 发表于 2023-9-11 20:28
最好是能描述一下你的使用场景,不然不好猜哪里有问题。


当时测试是把那几个函数都写在ReadFilePath.il里面,然后用一个函数ReadFilePath()调用ycGetFileName(),后面直接print路径,这样测试第一次是ReadFilePath.il的路径,然后我把它copy到另一个路径下,重新打开load print的路径有问题,不是当前路径打开的脚本的路径
发表于 2023-9-12 09:29:01 | 显示全部楼层


YuSHL 发表于 2023-9-11 17:20
我用了大佬ycGetFileName()那几个相关的函数,当两个不同路径下都存在同样的.il文件时,获取的路径不对
...


还是有问题啊
 楼主| 发表于 2023-9-12 10:08:28 | 显示全部楼层



发表于 2023-9-12 21:46:17 | 显示全部楼层


YuSHL 发表于 2023-9-12 08:36
当时测试是把那几个函数都写在ReadFilePath.il里面,然后用一个函数ReadFilePath()调用ycGetFileName(), ...


上代码
 楼主| 发表于 2023-9-13 12:00:05 | 显示全部楼层





  1. rocedure(ycGetDirName(\@optional file(ycGetFileName()) rel uniq "tgg")
  2.         let(()
  3.                 dir=if(pcreMatchp("^\\*.+\\*$" file)
  4.                         then
  5.                         getWorkingDir()
  6.                         else
  7.                         unless(pcreMatchp("^[~/]^\\.{1,2}/" file)
  8.                                 file=strcat("./" file)
  9.                         );end unless
  10.                         precReplace(precCompile("(?<=/)[^/]+/*$") file "" 0)
  11.                 );end if
  12.                 unless(rel
  13.                         dir=simplifyFilename(dir t)
  14.                 )
  15.                 when(uniq
  16.                         dir=pcreReplace(pcreCompile("/$") dir "" 1)
  17.                 );end when
  18.                 dir
  19.         )
  20. )
  21. procedure(ycGetFileName(\@optional fileName "g")
  22.         let((self dir)
  23.                
  24.                 self=get_filename(piport)
  25.                 when(fileName
  26.                         unless(stringp(fileName)
  27.                                 error("argument #1 should be a string or nil - %A" fileName)
  28.                         );end unless
  29.                         dir=ycGetDirName(self)
  30.                         self =strcat(dir "/" fileName)
  31.                 );end when
  32.                 self
  33. );end let
  34. );end
  35. ;
  36. procedure(ycRealPath(\@optional file("") "t")
  37.         unless(pcreMatchp("^[~/]" file)
  38.                 file=ycGetFileName(file)       
  39.         )       
  40.         simplifyFilenameUnique(file)       
  41. );
  42. procedure(ReadFilePath()
  43.         let((out)
  44.                 out=ycGetFileName()
  45.         )
  46. )
  47. ;
  48. ;;;



复制代码
用ycRealPath()返回的路径不对,ReadFilePath()里调用ycGetFileName()返回的是 "*ciwInPort*"
发表于 2023-9-13 21:52:11 | 显示全部楼层


YuSHL 发表于 2023-9-13 12:00
用ycRealPath()返回的路径不对,ReadFilePath()里调用ycGetFileName()返回的是 "*ciwInPort*"
...



不是这样用的,ycGetFileName()这个函数是用来返回当前这段代码所在的脚本文件的路径。


比如某个文件在/home/xxx/skill.il ,里面有一句代码 println(ycGetFileName())。
你在virtuoso中加载这个文件,load("/home/xxx/skill.il"),会打印出"/home/xxx/skill.il"

但是你如果在CIW直接运行ycGetFileName(),这段代码并不是存在某个文件,而是在 CIW 中,返回的就是*ciwInPort*。
ycGetDirName()函数我会判断这种情况,直接用virtuoso当前路径返回。


其次,你的需求是 “不管这个LOADFile.il放在哪个路径,都能获取到当前的路径,然后通过这个路径load其他脚本”。

假设这个脚本现在在/home/xxx/script/LOADFile.il,同一层路径又有 a.il b.il c.il 三个脚本文件。想实现不管这几个脚本一起放在哪个文件夹下,LOADFile.il中用同样的代码都可以找到a.il b.il c.il三个脚本并加载,只需要在LOADFile.il这样做。





  1. ycLoad("a.il")
  2. ycLoad("b.il")
  3. ycLoad("c.il")


复制代码


这样以后不管 script 这个文件夹在什么地方,都可以通过 load("...path.../script/LOADFile.il") 来加载这4个文件,且不用修改文件内容。


还有你发的这段代码是旧的,可以重新copy一下。博客里的是简化版的,只是演示一下思路,完整版优化了一些特殊情况,可以去文章开头的链接找到

 楼主| 发表于 2023-9-14 09:13:46 | 显示全部楼层
本帖最后由 YuSHL 于 2023-9-14 09:41 编辑


yangqi666 发表于 2023-9-13 21:52
不是这样用的,ycGetFileName()这个函数是用来返回当前这段代码所在的脚本文件的路径。


这个代码是从大佬gitee找的,应该是最新的;我再根据大佬的建议试试,之前的思路是下面这个callbackScriptsFile文件夹里面放脚本,然后和LoadMySkillScripts.il放到一个AllScriptsFile文件夹,希望下面代码yourFileDir可以根据LoadMySkillScripts.il获取,得到callbackScriptsFile文件夹路径,最后直接遍历load里面的脚本,当有新的脚本加入,直接放到文件夹里面就好,不用修改LoadMySkillScripts.il,其他人拿到直接load一个文件就好,不用做修改。


                               
登录/注册后可看大图

发表于 2023-9-14 21:50:39 | 显示全部楼层
本帖最后由 yangqi666 于 2023-9-15 16:43 编辑


YuSHL 发表于 2023-9-14 09:13
这个代码是从大佬gitee找的,应该是最新的;我再根据大佬的建议试试,之前的思路是下面这个callbackScript ...


LoadMySkillScripts.il 内的代码可以试试这样。


                               
登录/注册后可看大图


这种前提是已经加载过我的skill-loader代码,适和自己有很多类似的项目复用。

你说是需要发给别人的,那么核心问题只是需要获取到dir就行了,所以第二行dir只需要换成第三行注释的那句话就行了。(参考我的这个文件 skill-loader/load.il)


发表于 2023-9-14 22:09:58 | 显示全部楼层
eetop发代码的体验太差了,总是把格式打乱。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-18 00:27 , Processed in 0.042360 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表