【问题标题】:Why is my javascript file creating a file in one location but trying to read it from another?为什么我的 javascript 文件在一个位置创建文件但试图从另一个位置读取它?
【发布时间】:2012-12-28 18:49:31
【问题描述】:

我创建了一个变量来保存相对路径,因为我无法拥有直接路径,因为它将安装在不同的 PC 上。

var mainUrlCONST = "../../annotations/annotate.xml";

当程序的初始页面加载时,它会检查文件是否存在。 如果没有,它会创建它。

现在问题就在这里,它从我想要的位置读取,但如果不是 查看那里的文件,它会在 PC 上的其他位置而不是我指定的位置创建它。

这会检查文件:

function initializeAnnotationFile()
{
    try
    {
        var connection = new ActiveXObject("Microsoft.XMLHTTP");
        connection.open("GET", mainUrlCONST, false);
        connection.send();

        if ( connection.readyState == 4 )
        {
        response = connection.responseText;
        }

        xml = response; 
        mainExists = true;
    }
        catch(e)
    {
        mainExists = false; 
    }
}

如果文件不存在,则创建该文件:

function createAnnotationFile()
{
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var s = fso.CreateTextFile(mainUrlCONST, true);

    s.WriteLine( "<list>" );
    s.WriteLine( "  <section title='Annotations'>" );
    s.WriteLine( "  </section>" );
    s.WriteLine( "</list>" );
}

这是有效的直接路径,如果有帮助的话。

var mainUrlCONST = "G:/folder/annotations/annotate.xml";

【问题讨论】:

  • 您的问题缺少基本信息: 1. 这是在什么环境下运行的? 2. 查找文件的代码是什么样的? 3. 写入文件的代码是什么样的? 4. 文件在哪里结束? 5. 你期望它会在哪里结束? 6. 为什么会这样?
  • 您没有向我们展示任何代码。当您不向我们展示您在做什么时,您希望我们如何帮助您?
  • 你写文件的代码是什么样的?怎么读文件?这不仅仅是关于路径,而是你如何使用路径。此外,在路径名中使用 .. 来设计可在机器之间移植的脚本似乎是个坏主意。
  • @AlexWayne 他并没有说它是可移植的,只是说它可以安装在多台机器上。
  • @techfoobar 这似乎是非常面向 IE 的代码,localStorage 在 IE 的本地应用中不可用。

标签: javascript relative-path createfile


【解决方案1】:

FSO 和相对路径存在问题。所有文档都说,路径可以是绝对路径也可以是相对路径,但就我个人而言,我从来没有使用相对路径。

我在本地应用程序中使用基于安装文件夹的寻址系统。一个简化的版本是这样的:

function getInstallBase() {
    var defInstal = 'Application_installation_folder_name',
        selfPath = window.location.pathname.replace(/\\/g,'/');
    if (selfPath.charAt(0) === '/') { // *
        selfPath = selfPath.substring(1, selfPath.length);
    }
    selfPath = selfPath.split(defInstal);
    return selfPath[0] + defInstal + '/';   
}
var defRoot = getInstallBase();

* = IE 返回 /G:/... 当 HTA 返回 G:/...

defRoot 现在包含安装文件夹的绝对路径,无论它保存在哪里。

将此代码放入应用程序安装文件夹中的 JS 文件中。如果您需要路径,请根据defRoot 提供它,即从安装文件夹中计算。在您的情况下(假设 folder 是安装文件夹),您可以像这样使用它:

var s = fso.CreateTextFile(defRoot + 'annotations/annotate.xml', true);

我已经将这种技术用于便携式应用程序,它就像一个魅力。您可以根据需要将可执行副本复制到记忆棒、CD、DVD 上,完全无需修改代码。

【讨论】:

  • 我继续并将其标记为答案,因为我毫不怀疑这会起作用,但是由于该应用程序当前作为网站运行并且尚未打包和安装,因此没有设置安装路径。
  • @xRuhRohx 我在 Intranet 服务器运行的 HTA 中也使用了它,没有问题。也许您需要设置defRoot 以进行测试,当在服务器上时,最终在客户端机器上执行 HTA。
  • 当它检查文件时,它检查到正确的地方,但是当它写入时,它想写入桌面。我假设是因为它在 IE 中运行,尚未打包为应用程序并安装。
  • @xRuhRohx 也许你对这个假设是正确的。无论如何,如果您正在开发桌面应用程序,那么在桌面环境中也这样做是自然的吗? HTA 也可以在本地流畅运行,无需任何打包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2019-12-27
相关资源
最近更新 更多