如何测试 Tabris 中是不是存在文件?

Posted

技术标签:

【中文标题】如何测试 Tabris 中是不是存在文件?【英文标题】:How to test if a file exists in Tabris?如何测试 Tabris 中是否存在文件? 【发布时间】:2018-12-25 07:47:07 【问题描述】:

这是一个在 Tabris 中读取和写入文件的示例(在操场上工作)。 (这可能是一个很好的 sn-p 帮助理解 ios/android/Windows 上的“路径”)

如果您尝试读取不存在的文件,则会报告一般错误。

如何测试文件是否存在?

我已经尝试了一些无效的 Nodejs 方法。

谢谢

代码

const fs, Button, TextView, TextInput, ui = require('tabris')

const FILENAME = 'hello.txt'
const FILEPATH = fs.filesDir + '/' + FILENAME

console.log(FILEPATH)

let btnReadFile = new Button(
  centerX: 0,  top: 'prev() 10', width: 200,
  text: 'Read File: ' + FILENAME
).appendTo(ui.contentView)

btnReadFile.on('select', () => 
  fs.readFile(FILEPATH, 'utf-8')
    .then(text => txiFile.text = text)
    .catch(err => console.error(err))
)

let btnWriteFile = new Button(
  centerX: 0,  top: 'prev() 10', width: 200,
  text: 'Write File: ' + FILENAME
).appendTo(ui.contentView)

let btnRemoveFile = new Button(
  centerX: 0,  top: 'prev() 10', width: 200,
  text: 'Remove File: ' + FILENAME
).appendTo(ui.contentView)

btnWriteFile.on('select', () => 
  fs.writeFile(FILEPATH, txiFile.text, 'utf-8')
    .then(() => console.log('file written:', FILEPATH))
    .catch(err => console.error(err))
)

btnRemoveFile.on('select', () => 
  txiFile.text = ''
  fs.removeFile(FILEPATH)
    .then(() => console.log('file removed:', FILEPATH))
    .catch(err => console.error(err))
)

let txiFile = new TextInput(
  top: 'prev() 20', left: '20%', right: '20%', height: 100,
  type: 'multiline'
).appendTo(ui.contentView)

屏幕截图


使用 fs.readDir 解决方案更新代码不起作用...

函数总是返回 false - 但在 async function() 内部我看到它正在工作,并且 filesDir 正确列出了文件。

const FILENAME = 'helloxxppp.txt'
const FILEPATH = fs.filesDir
const FULLFILEPATH = FILEPATH + '/' + FILENAME

console.log('FILENAME: \n ' + FILENAME)
console.log('FILEPATH: \n ' + FILEPATH)
console.log('FULLFILEPATH \n: ' + FULLFILEPATH)

// this ALWAYS is false
if (fileExist(FILEPATH, FILENAME)) 
  console.log('File NOT exists\n')
 else 
  console.log('File exists\n')


async function fileExist (path, file) 
  let files
  try 
    files = await fs.readDir(path)
    console.log(files)
   catch (err) 
    return false
  
  return files.indexOf(file) > -1

【问题讨论】:

你尝试了哪些 Nodejs 方法? ***.com/questions/4482686/… 当您尝试它时,您是否为 require('fs') 创建了一个不同的变量,因为您已经将 fs 用于 tabris? @JosephWebber Tabris.js 环境不使用与 Node 相同的 fs。这是一个单独的,方法不同:docs.tabris.com/latest/api/fs.html 我知道,我在问 OP 在尝试使用 Node 的 fs 时是否使用了不同的变量名,因为 var fs 会与 const fs, ... 冲突。 【参考方案1】:

异步/等待版本:

const fs = require('tabris')

async function fileExist(path, file) 
  let files
  try 
    files = await fs.readDir(path)
   catch (err) 
    return false
  
  return files.indexOf(file) > -1

承诺版本:

const fs = require('tabris')

function fileExist(path, file) 
  return new Promise((resolve, reject) => 
    fs.readDir(path)
      .then(files => resolve(files.indexOf(file) > -1))
      .catch(err => resolve(false)) // Error is ignored intentionally
  )

用法:

1) 使用then:

const FILENAME = 'helloxxppp.txt'
const FILEPATH = fs.filesDir

fileExist(FILEPATH, FILENAME).then((exist) => 
  if (exist) 
    console.log('File NOT exists\n')
   else 
    console.log('File exists\n')
  
)

2) 使用async/await:

async myFunction() 
  // code here
  let exist = await fileExist(FILEPATH, FILENAME)
    if (exist) 
    console.log('File NOT exists\n')
   else 
    console.log('File exists\n')
  

【讨论】:

我同意这个答案。 Tabris.js 还没有确定文件是否存在的方法,因此您必须自己实现它。这是一个很好的功能请求候选者。 谢谢,我明白了,获取文件列表,如果 indexOf > -1,文件存在。我试图把它放在我的例子中,但函数总是返回 false - 你能看到我哪里出错了吗,(在 Playground 中工作) 我将函数添加到我的代码中,请参阅上面的“使用 fs.readDir 解决方案更新代码不起作用...”我编辑的 POST 我一定遗漏了一些东西... 我没有安装开发工具。你能用调试器进入函数并检查会发生什么吗? 不确定“开发工具” - 我的代码将在 tabrisjs.com/playground 中运行 - 这是作为 GIST 的完整代码 gist.github.com/mrmccormack/fdef86b4a710db08b019ab93f44d5de5 - 希望对您有所帮助...

以上是关于如何测试 Tabris 中是不是存在文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bash 测试文件中是不是存在字符串?

如何使用 XSLT 测试图像文件是不是存在?

如何测试FILE是不是存在并且在D中是不是可读

如何在 Apache 2.4 上使用标签 <If ...> 测试文件是不是存在?

如何找出 C# / .NET 中是不是存在文件?

如何在 Flutter ListView 的构建过程中测试 json 属性是不是存在