2013-09-21 74 views
3

所以我想使用相对路径将声音文件加载到缓冲区中。 (我把我的东西放在版本控制之下,不想做任何关于某人可能在其文件系统上克隆回购的假设)。如何提供Buffer.read的相对路径?

所以,我最初假设如果我提供了一条相对看起来相对的路径,那么SC会将其解释为与正在执行的文件的位置有关:

Buffer.read(s, "Samples/HiHats1.hihat2.wav"); 

但是SC无法找到该文件。于是我抬起头asAbsolutePath,并试图指出:

Buffer.read(s, "Samples/HiHats1.hihat2.wav".asAbsolutePath); 

这不起作用,或者是因为SC无法从我的亲戚一个锻炼的绝对路径。

"Samples/HiHats1.hihat2.wav".asAbsolutePath 

...实际上在我的文件系统上返回一个不存在的位置。欢呼!

任何人都可以提出任何建议,我可以如何实现这个麻烦的任务?

回答

10

SuperCollider处理相对路径就像许多软件一样,它可以解决它们相对于当前工作目录。通常这是相对于可执行文件,而不是脚本文件,因此造成混淆。

你的情况下当前的工作目录是什么?您可以通过运行

 File.getcwd 

发现(这是.asAbsolutePath用途。)的CWD取决于您的操作系统 - 在一些平台上它不是一个特别方便默认。你不能依赖它是什么特别的东西。

在你的情况下,如果你想要解决路径相对于你的脚本或类的位置,那么你需要自己做。例如:

 // Use the path of whatever file is currently executing: 
    var samplePath = thisProcess.nowExecutingPath.dirname +/+ "Samples/HiHats1.hihat2.wav"; 

    // Use the path of the class file for the class you're coding 
    var samplePath = this.class.filenameSymbol.asString.dirname +/+ "Samples/HiHats1.hihat2.wav"; 
+0

再次感谢解决方案和解释。 – David