try
{
var myObject, f;
myObject = new ActiveXObject("Scripting.FileSystemObject");
f = myObject.GetFile("C:\\img.txt");
f.Move("E:\\jarvis\\Images\\");
}
catch(err)
{
alert("file does not exist")
}
function fetchStatus( address ) {
var client = new XMLHttpRequest();
client.onload = function() {
// in case of network errors this might not give reliable results
returnStatus( this.status );
}
client.open( "HEAD", address, true );
client.send();
}
function returnStatus( status ) {
if ( status === 200 ) {
console.log( 'file exists!' );
}
else {
console.log( 'file does not exist! status: ' + status );
}
}
合适的解决方案是创建非缓存的HTTP HEAD请求。Nik Sumeiko的答案使用no-cache报头,这意味着响应可以被缓存,但在重用之前必须重新验证。在这种情况下,服务器可能返回304: Not Modified,它不是200: OK,因此是假阴性。
为了避免缓存,正确的头文件是Cache-Control: no-store
文件可以在没有HTTP 200响应的情况下存在
你还应该记住,重定向 (301: Moved Permanently, 307: Temporary Redirect或308: Permanent Redirect)可能会发生,所以文件可以存在于其他地方,并且可以从不同的位置返回:根据用例,在这种情况下,可以选择重定向而不是返回false。
另外请记住,如果您在不同的域上检查文件是否存在,并且它的CORS策略没有打开到您的服务器,后台请求将被阻止。在这种情况下,通常返回403: Forbidden,这并不意味着文件不存在,而是文件不可用。最后但并非最不重要的,同样适用于500: Internal Server Error响应,这意味着HTTP服务器未能处理请求,但该文件可以通过其他方式可用,如通过FTP。
如果文件存在,则返回true;如果文件不可用或重定向,则返回false: 或 undefined:
const fileExists = file =>
fetch(file, {method: 'HEAD', cache: 'no-store'})
.then(response => ({200: true, 404: false})[response.status])
.catch(exception => undefined);
fileExists("yourFile.html").then(yes => yes && alert("yourFile.html exists"));
// or in the async scope...
let yourFileExists = await fileExists("yourFile.html");