Node.js에서 파일의 존재 여부를 판단합니다

3497 단어 Node.js파일
노드를 기록합니다.js 응용 프로그램의 작은 지식 포인트, Google/Baidu "Node.js가 파일의 존재 여부를 어떻게 판단하는가"에서 발견한 많은 답안은 fs를 사용하는 것입니다.exists, 여기는 fs를 추천하지 않습니다.exists 당신은 fs를 선택할 수 있습니다.stat 또는 fs.access.
왜 fs를 추천하지 않습니까?exists
우리가 리셋 함수를 설계할 때, 통상적으로'오류 우선 리셋 함수'라는 원칙을 따른다. 즉, 반환값의 첫 번째 파라미터는 오류 정보로 오류 여부를 검증하고, 다른 파라미터는 데이터를 되돌려주는 데 쓰인다.
아래와 같이 fs입니다.exists의 사용 예시에서 하나의 볼 값을 직접 되돌려주었는데'오류 우선의 리셋 함수'라는 설계 원칙에 위배된다. 이것은 한 가지 원인이다.

fs.exists('/etc/passwd', (exists) => { 
 console.log(exists ? ' ' : ' '); 
}); 
또 하나는 fs에서 추천하지 않는 거예요.open()、 fs.readFile () 또는 fs.writeFile () 을 사용하기 전에 fs.exists () 는 파일의 존재 여부를 판단합니다. 왜냐하면 이것은 경쟁 조건을 일으킬 수 있기 때문입니다. 만약에 다중 프로세스에서 프로그램의 실행이 완전히 선형적이지 않으면 프로그램의 한 프로세스가 fs를 실행할 때exists와 fs.writeFile () 을 사용하면 다른 프로세스가 이 사이에서 파일의 상태를 변경할 수 있습니다. 그러면 예상치 못한 결과를 초래할 수 있습니다.
권장하지 않음:

(async () => { 
 const exists = await util.promisify(fs.exists)('text.txt'); 
 console.log(exists); 
 await sleep(10000); 
 if (exists) { 
  try { 
   const res = await util.promisify(fs.readFile)('text.txt', { encoding: 'utf-8' }); 
   console.log(res); 
  } catch (err) { 
   console.error(err.code, err.message); 
   throw err; 
  } 
 } 
})(); 
추천:

(async () => { 
 try { 
  const data = await util.promisify(fs.readFile)('text.txt', { encoding: 'utf-8' }); 
  console.log(data); 
 } catch (err) { 
  if (err.code === 'ENOENT') { 
   console.error('File does not exists'); 
  } else { 
   throw err; 
  } 
 } 
})(); 
현재exists는 이미 폐기되었습니다. 또한 파일을 직접 사용하지 않을 때만 파일이 존재하는지 검사할 수 있습니다. 다음은 파일이 존재하는지 확인하는 방법을 추천합니다.
사용 fs.stat
fs.stat fs 반환Stats 대상, 이 대상은 파일의 크기, 창설 시간 등 파일에 대한 많은 정보를 제공합니다.그중에는 두 가지 방법stats가 있다.isDirectory()、stats.isFile () 은 디렉토리인지 파일인지 여부를 판단하는 데 사용됩니다.

const stats = await util.promisify(fs.stat)('text1.txt'); 
console.log(stats.isDirectory()); // false 
console.log(stats.isFile()); // true 
파일이 존재하는지 확인하기만 하면 아래의 fs를 추천합니다.access.
사용 fs.access
fs.access는 모드 매개 변수를 수신하면 파일이 존재하는지, 읽을 수 있는지, 쓸 수 있는지 판단할 수 있으며, 반환 값은err 매개 변수입니다.

const file = 'text.txt'; 
 
//  。 
fs.access(file, fs.constants.F_OK, (err) => { 
 console.log(`${file} ${err ? ' ' : ' '}`); 
}); 
 
//  。 
fs.access(file, fs.constants.R_OK, (err) => { 
 console.log(`${file} ${err ? ' ' : ' '}`); 
}); 
 
//  。 
fs.access(file, fs.constants.W_OK, (err) => { 
 console.log(`${file} ${err ? ' ' : ' '}`); 
}); 
 
//  、 。 
fs.access(file, fs.constants.F_OK | fs.constants.W_OK, (err) => { 
 if (err) { 
  console.error( 
   `${file} ${err.code === 'ENOENT' ? ' ' : ' '}`); 
 } else { 
  console.log(`${file}  , `); 
 } 
}); 
같은 것도 fs에서 추천하지 않아요.open()、 fs.readFile () 또는 fs.writeFile () 을 사용하기 전에 fs.exists () 가 파일의 존재 여부를 판단하면 경쟁 조건을 일으킬 수 있습니다.
Reference
http://nodejs.cn/api/fs.html
지금까지 노드였습니다.js에서 파일의 존재 여부를 판단하는 상세한 내용, 더 많은 Node.js 파일의 존재 여부를 판단하는 자료는 저희 기타 관련 문장에 주목하세요!

좋은 웹페이지 즐겨찾기