使用JavaScript仅检查本地文件是否存在

24

我希望检查位于HTML文件位置的本地文件是否存在。必须使用JavaScript。 JavaScript永远不会被禁用。jQuery不是最好的选择,但可以使用。

顺便说一句,我正在为Mac制作钛应用程序,因此我正在寻找一种保护免受那些点击“显示包内容”的人的文件的方法。


“本地”是指客户端机器吗?也就是说,使用浏览器的那台机器。如果是这样,答案是否定的——您无法访问文件。但是不清楚您的意思是什么。 - harpo
2
你明白这有多么可怕的不安全吗? - rook
我正在我的电脑上进行这个操作,所以它不会上传到服务器。 - JqueryToAddNumbers
无论如何,假装文件位于“assets/index.html”,我想检查资产中是否存在该文件。 - JqueryToAddNumbers
使用ajax,可以查看我的答案:https://dev59.com/s3A65IYBdhLWcg3wxBir#14691735 - Matthew James Davis
那个程序是在服务器上运行的,我在想是否可以在客户端上运行,但出于安全原因这是不可能的。 - JqueryToAddNumbers
9个回答

14

您的问题不够明确,因此取决于您真正想要实现什么,可能会有多个可能的答案。

如果您正在使用Titanium开发桌面应用程序(我猜测是这样),则可以使用FileSystem模块的getFile来获取文件对象,然后使用exists方法检查它是否存在。

这是从Appcelerator网站上摘录的一个示例:

var homeDir = Titanium.Filesystem.getUserDirectory();
var mySampleFile = Titanium.Filesystem.getFile(homeDir, 'sample.txt');

if (mySampleFile.exists()) {
    alert('A file called sample.txt already exists in your home directory.');
    ...
}

查看getFile方法参考文档

以及exists方法参考文档

对于那些认为他正在问一个普通的Web开发情况的人,这是我会给出的两个答案:

1)您想检查服务器端文件是否存在。 在这种情况下,您可以使用ajax请求尝试获取文件并根据接收到的答案做出反应。但是,请注意,您只能检查由您的Web服务器公开的文件。更好的方法是编写一个服务器端脚本(例如php),它将为您执行检查,给定一个文件名,并通过ajax调用该脚本。此外,请注意,如果您不小心,您很容易在应用程序/服务器中创建安全漏洞。

2)您想检查客户端文件是否存在。 在这种情况下,正如其他人指出的那样,由于安全原因(虽然IE曾经通过ActiveX和Scripting.FileSystemObject类允许此操作),这是不允许的,并且这很好(没有人希望您能够浏览他们的文件),因此请忘记这个想法。


13

既然“Kranu”建议说:“与文件系统的唯一交互是加载js文件......”,那么用错误检查这样做至少会告诉你文件是否不存在——这对你来说可能已经足够了?

本地计算机,您可以通过尝试将其作为外部脚本加载并检查错误来检查文件是否不存在。例如:

<span>File exists? </span>
<SCRIPT>
    function get_error(x){
        document.getElementsByTagName('span')[0].innerHTML+=x+" does not exist.";
    }
    url="   (put your path/file name in here)    ";
    url+="?"+new Date().getTime()+Math.floor(Math.random()*1000000);
    var el=document.createElement('script');
    el.id="123";
    el.onerror=function(){if(el.onerror)get_error(this.id)}
    el.src=url;
    document.body.appendChild(el);
</SCRIPT>

一些笔记...

  • 将一些随机数据附加到文件名(例如url+="?"+new Date等),以便浏览器缓存不会提供旧的结果。
  • 如果您在循环中使用此代码,请设置唯一的元素id(el.id=),以便get_error函数可以引用正确的元素。
  • 设置onerror(el.onerror=function)行有点复杂,因为需要调用get_error函数并传递el.id,如果只设置对函数的普通引用(例如:el.onerror=get_error),则无法传递el.id参数。
  • 请记住,这仅检查文件不存在的情况。

非常感谢您抽出时间回复,我发布这个解决方案的原因是为了帮助其他在寻找答案的人。我对那些在这个帖子中贡献“无法完成”这一观点的人感到困惑,因为这似乎毫无价值。 - Siubear
那么,直到将元素附加到文档中,错误事件才会被触发?我猜可以将其“隐藏”附加,但如果可能的话,最好根本不需要附加它。 - Per Quested Aronsson
我在Firefox上尝试了这个代码:url="c:\\Windows\\Web\\js.js";,无论文件是否存在,它总是返回123不存在。 我还尝试了:url="file://c:\\Windows\\Web\\js.js";,结果也是一样的。 - Kevin Fegan

9
您可以使用这个。
function LinkCheck(url)
{
    var http = new XMLHttpRequest();
    http.open('HEAD', url, false);
    http.send();
    return http.status!=404;
}

1
你如何使用它来检查文件的存在? - Chetan Purohit
1
@ChetanPurohit - 你可以这样调用它:var x=LinkCheck("c:\\Windows\\Web\\Wallpaper\\img1.jpg");。然后测试x的值:x ? alert("文件存在") : alert("文件不存在"); 或者 if (x){ alert("文件存在"); } else { alert("文件不存在"); }。不幸的是,我在我的系统上尝试了这个方法,在http.open('HEAD', url, false);这一行之后失败了。 - Kevin Fegan
@ChetanPurohit - 我也尝试过 var x=LinkCheck("file://c:\\Windows\\Web\\Wallpaper\\img1.jpg");,但在 http.send(); 后失败了。在两种情况下,“失败”的原因是它不能从对 LinkCheck() 的调用中返回。 - Kevin Fegan
感谢您回复,@Kevin。 - Chetan Purohit
在上面所示的open语句中,false表示同步操作。我刚发现这个:注意:从Gecko 30.0(Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27)开始,在主线程上进行的同步请求已被弃用,因为对用户体验有负面影响。 使用XMLHttpRequest - Kevin Fegan
非常好,谢谢! - Manny Alvarado

5

Javascript无法访问文件系统并检查其是否存在。与文件系统的唯一交互是加载js文件和图像(png / gif等)。

Javascript不适合这项任务。


3

如果你想使用JavaScript检查文件是否存在,那么不行,据我所知,由于安全原因,JavaScript无法访问文件系统。

但是,对于我来说,你的意图还不够清楚。


3

幸运的是,出于安全原因,使用标准JS无法访问客户端文件系统。不过有一些专有解决方案存在(例如微软的仅限于IE的ActiveX组件)。


2
一种替代方法: 您可以使用一个“隐藏”的小程序元素,该元素使用特权操作对象实现此存在检查,并通过覆盖其运行方法:
File file = new File(yourPath);
return file.exists();

什么是“隐藏”的小程序元素? - clankill3r

1
创建一个img标签,并将src属性设置为您要查找的文件,是我发现实现此目的的一种方法。当文件存在时,img元素的onload或onerror将触发。您无法使用此方法加载任何数据,但可以确定特定文件是否存在。

2
我刚刚尝试了这种方法。当加载非图像类型时,错误处理程序被调用。因此无法确定文件是否存在! - Fuzzyma
3
如果你发现了一种方法,但其他人说它不起作用,我建议你分享你的代码,以便我们可以看到你是如何实现的。 - YakovL

1
如果您使用Nodejs,则无需外部库,只需导入文件系统模块即可。请随意编辑以下代码: const fs = require('fs')
const path = './file.txt'

fs.access(path, fs.F_OK, (err) => {
  if (err) {
    console.error(err)
    return
  }

  //file exists
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接