ජාවා හි ගොනුවක් තිබේදැයි පරීක්ෂා කරන්නේ කෙසේද?


856

ජාවා ( පර්ල්ස් වලට සමාන -e $filename) කියවීම සඳහා එය විවෘත කිරීමට පෙර ගොනුවක් තිබේදැයි පරීක්ෂා කරන්නේ කෙසේද ?

SO හි ඇති එකම සමාන ප්‍රශ්නය ගොනුව ලිවීම හා සම්බන්ධ වන අතර මෙයට පිළිතුරු FileWriterසපයන්නේ පැහැදිලිවම මෙහි අදාළ නොවේ.

හැකි නම්, සමහර "ගොනුවක් විවෘත කිරීමට සහ පිටපතේ 'ගොනුවක් නැත' යන්න ඔබ පරික්ෂා කරන ව්‍යතිරේකයක් විසි කරන විට අල්ලා ගැනීමට සමහර API ට වඩා සත්‍ය / අසත්‍ය නැවත පැමිණීමට මම කැමතියි , නමුත් මට ජීවත් විය හැකිය පසු.


3
එසේම ඔබ සුදුසු ගොනු අවසර සඳහා පරීක්ෂා කිරීමට අවශ්ය බව එක් කිරීමට අවශ්ය: docs.oracle.com/javase/6/docs/api/java/io/File.html java.io.File ක්රම ඇත canRead, canWriteසහ canExecuteඒ සඳහා පරීක්ෂා කිරීමට .
කිර්ක්ලන්ඩ්

6
මෙය භයානක බව සැලකිල්ලට ගත යුතුය. ඔබගේ "මෙම ගොනුව තිබේද" ක්‍රමය නැවත පැමිණි වහාම ඇතුළුව ඕනෑම වේලාවක ගොනු පද්ධතිය වෙනස් විය හැකිය. ඔබට කෙසේ හෝ එම නඩුව හැසිරවිය යුතු බැවින්, එවැනි ක්‍රමයක් සැක සහිත උපයෝගීතාවයකි. ඔබ ගොනුව විවෘත කිරීමට යන්නේ නම්, ඒ සඳහා නිවැරදි ක්‍රමය වන්නේ ගොනුව විවෘත කර අදාළ ව්‍යතිරේකය හැසිරවීමයි.
කෙවින්

1
කෙවින් හොඳ කරුණක්, නමුත් එය සමගාමී නොවන පරිසරයක අවිවාදිත උපයෝගීතාවයකි, මෙය මට අවශ්‍ය වූයේ මෙයයි;)
DVK

V ඩීවීකේ: ඔබ ධාවනය කරන්නේ පූර්වයෙන් බහු කාර්යයන් සහිත මෙහෙයුම් පද්ධතියකද? එක්කෝ එය හෝ එය විශේෂයෙන් නිර්මාණය කරන ලද ජාවා චිපයකි . කලින් නම්, ඔබ සිටින්නේ සමගාමී පරිසරයක ය. වෙනත් ක්‍රියාදාමයන් මඟින් ගොනු පද්ධතිය ඔබට යටින් වෙනස් කළ හැකිය.
කෙවින්

2
එය කෙවින් වැදගත් නොවන නමුත් එය පුද්ගලික භාවිතය සඳහා නිර්මාණය කර ඇති තනි නූල් යෙදුමකි. එය කැපවූ ගොනුවක් කෙසේ හෝ නිර්මාණය කිරීමට / යටින් වෙනස් කිරීමට ඇති අවස්ථා ඇදහිය නොහැකි තරම් අඩුය.
DVK

Answers:


1365

භාවිතා කිරීම java.io.File:

File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) { 
    // do something
}

15
පවතින සමහර අවස්ථා තිබේ () වැරදි ප්‍රති .ලයක් ලබා දෙනු ඇත. උදාහරණයක් ලෙස, එන්එෆ්එස් ගොනු පද්ධතියක් භාවිතා කරන විට පරණ ගොනු හැසිරවීම් පිළිබඳ ගැටළුවක් ඇත: bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595 එය එක්තරා ආකාරයක අපැහැදිලි ය, නමුත් නිෂ්පාදන කේතයේ සමහර කලකිරවන දෝෂ වලට හේතුව එයයි කලින්.
CAW

26
if(f.isFile())ඒ වෙනුවට භාවිතා කරන්න .
ලියොන්

1
සුදු අවකාශයන් වළක්වා ගැනීම සඳහා filePathString.trim () භාවිතා කිරීමට මතක තබා ගන්න
අසීම්

439

isFile()වෙනුවට භාවිතා කිරීමට මම නිර්දේශ කරමි exists(). බොහෝ විට ඔබ සොයන්නේ මාර්ගය ගොනුවකට යොමු වන්නේ එය පමණක් නොව එයද යන්නයි. exists()ඔබේ මාර්ගය නාමාවලියකට යොමු කළහොත් එය සත්‍යයක් බව මතක තබා ගන්න .

new File("path/to/file.txt").isFile();

new File("C:/").exists() සත්‍ය බවට පත්වන නමුත් එය ගොනුවක් ලෙස විවෘත කර කියවීමට ඔබට ඉඩ නොදේ.


1
d ylun.ca උදාහරණයට උප බහලුම් ඇතුළත්ද? ඔබ වත්මන් බහලුම ලබා දී යන්න ඇසීමට අදහස් නම් /path, new File("file.txt").exists()ආපසු trueනිවැරදි සම්පූර්ණ මාර්ගය නම් /path/to/file.txt(වෙනත් ගොනු නම් මිස, පිළිතුර ලොකු නැත /path/file.txtපවතී).
මතෙව්

158

ජාවා SE 7 හි nio භාවිතා කිරීමෙන්,

import java.nio.file.*;

Path path = Paths.get(filePathString);

if (Files.exists(path)) {
  // file exist
}

if (Files.notExists(path)) {
  // file is not exist
}

දෙකම නම් existsහා notExistsආපසු බොරු, ගොනුව පැවැත්ම තහවුරු කර ගත නොහැකි ය. (සමහර විට මෙම මාර්ගයට ප්‍රවේශ වීමේ අයිතියක් නැත)

pathනාමාවලියක් හෝ සාමාන්‍ය ගොනුවක් දැයි ඔබට පරීක්ෂා කළ හැකිය .

if (Files.isDirectory(path)) {
  // path is directory
}

if (Files.isRegularFile(path)) {
  // path is regular file
}

කරුණාකර මෙම ජාවා SE 7 නිබන්ධනය පරීක්ෂා කරන්න .


2
නව ගොනුව (මාර්ගය) හා සසඳන විට අත්තිකාරම් මොනවාද .එක්සිස්ට් ()? පාලින් චෙක්පතක් තිබේදැයි පරීක්ෂා කරන්න
රගු කේ නයාර්

2
@RaghuKNair java.nio.file.Files.exists()වේ ගොඩක් වඩා වේගයෙන් java.io.File.exists()(: Windows Server 2012 ධාවනය ජාවා 1.7.0_45 x64 මම පරීක්ෂා එකම පරිගණකය මත මගේ කුඩා මිණුම් ලකුණක් සිට).
මැතිව්

1
මම එය තනිවම අත්හදා බැලූ අතර එය java.nio.file.Files.exists()5 ගුණයකින් අඩු විය . (Win7 Java 1.7.0_79 - x86)java.io.File.exists
ParkerHalo

නූල වලංගු නොවන්නේ නම් Paths.get විසින් ව්‍යතිරේකයක් විසි කිරීමේ අවාසියද මෙයයි
රිචඩ්

46

ජාවා 8 භාවිතා කිරීම:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}

2
Files.exists()තර්ක දෙකක් ගනී. සාමාන්යයෙන්, ඔබට එවැනි දෙයක් අවශ්ය වනු Files.exists(path, LinkOption.NOFOLLOW_LINKS )ඇත.
මයික් සී

1
IkeMikeC දෙවන තර්කය නොමැතිව කුමන ක්‍රමය කැඳවනු ඇත්දැයි මම කල්පනා කරමි. ලේඛනය ඒ පිළිබඳ කිසිදු තොරතුරක්වත් නොපෙන්වයි.
පවර්ෆ්ලවර්

1
OwerPowerFlower: ඇත්තේ එක් Files.exists () ක්‍රමයක් පමණි. දෙවන තර්කය සම්මත නොකර, එය තවමත් එකම ක්රමය ලෙස හැඳින්වේ. දෙවන තර්කය varargs විචල්‍යය වන අතර LinkOptions 0 හෝ වැඩි ගණනක් සමත් විය හැකිය.
TK8

27
File f = new File(filePathString); 

මෙය භෞතික ගොනුවක් සාදන්නේ නැත. පංති ගොනුවේ වස්තුවක් නිර්මාණය කරයි. ගොනුවක් භෞතිකව නිර්මාණය කිරීම සඳහා ඔබ එය පැහැදිලිවම නිර්මාණය කළ යුතුය:

f.createNewFile();

එබැවින් f.exists()එවැනි ගොනුවක් තිබේද නැද්ද යන්න පරීක්ෂා කිරීමට භාවිතා කළ හැකිය.



17

මෙය සාක්ෂාත් කර ගැනීම සඳහා විවිධ ක්‍රම තිබේ.

  1. සාධාරණ පැවැත්මක් සඳහා නම්. එය ගොනුවක් හෝ නාමාවලියක් විය හැකිය.

    new File("/path/to/file").exists();
  2. ගොනුව සඳහා පරීක්ෂා කරන්න

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isFile()) {}
  3. නාමාවලිය සඳහා පරීක්ෂා කරන්න.

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isDirectory()) {}
  4. ජාවා 7 මාර්ගය.

    Path path = Paths.get("/path/to/file");
    Files.exists(path)  // Existence 
    Files.isDirectory(path)  // is Directory
    Files.isRegularFile(path)  // Regular file 
    Files.isSymbolicLink(path)  // Symbolic Link


14

ගූගල් හි "ජාවා ගොනුව පවතී" සඳහා පළමු පහර:

import java.io.*;

public class FileTest {
    public static void main(String args[]) {
        File f = new File(args[0]);
        System.out.println(f + (f.exists()? " is found " : " is missing "));
    }
}

1
F.exists පරීක්ෂා කිරීමට පෙර f! = Null දැයි පරීක්ෂා කිරීම අවශ්‍ය නොවේ, නව මූල පදය අසමත් වුවහොත් එය ව්‍යතිරේකයක් ජනනය කරනු ඇත.
ෂෝන් ඒ ඕ හාර්නි

f! = null නම් චෙක්පතක් නොමැත. f + (...) භාවිතා කරන්නේ java.io.File.toString
කවුරුහරි

ඇත්ත වශයෙන්ම, එය භාවිතා කරයි String.valueOf(), එය
ශුන්‍ය ලෙස

12

එපා. අල්ලා ගන්න FileNotFoundException.ගොනු පද්ධතියට කෙසේ හෝ ගොනුව තිබේද යන්න පරීක්ෂා කළ යුතුය. ඒ සියල්ල දෙවරක් කිරීමෙන් පලක් නැත, එසේ නොකිරීමට හේතු කිහිපයක්:

  • කේතය දෙගුණ කරන්න
  • ඔබ පරීක්‍ෂා කරන විට ගොනුව පැවතිය හැකි කාල කවුළු ගැටළුව, නමුත් ඔබ විවෘත කරන විට නොව, අනෙක් අතට, සහ
  • මෙම ප්‍රශ්නයේ පැවැත්ම පෙන්නුම් කරන පරිදි, ඔබට වැරදි පරීක්‍ෂණයක් කර වැරදි පිළිතුරක් ලබා ගත හැකිය.

පද්ධතිය දෙවන වරට අනුමාන කිරීමට උත්සාහ නොකරන්න. එය දනී. අනාගතය ගැන අනාවැකි කීමට උත්සාහ නොකරන්න. පොදුවේ ගත් කල ඕනෑම සම්පතක් තිබේදැයි පරීක්ෂා කිරීමට හොඳම ක්‍රමය එය භාවිතා කිරීමට උත්සාහ කිරීමයි.


ගොනුවක් කෙලින්ම ස්ථානයක තැන්පත් කර ඇත්දැයි බැලීමට මට සෑම පැයක්ම පරීක්ෂා කිරීමට අවශ්‍ය නම් කුමක් කළ යුතුද? මා සතුව වෙබ් මෙතොඩ්ස් ව්‍යාපෘතියක් ඇත, එය විශේෂිත ගොනුවක් විශේෂිත ධාවකයකට උඩුගත කර ඇත්දැයි පරීක්ෂා කළ යුතුය. මෙය සිදු කරන්නේ කෙසේද? ගොනුව තිබේදැයි බැලීමට සෑම පැයකදීම පරීක්ෂා කිරීමට මට අවශ්‍ය යැයි කියමු. පන්තියක් ලිවීමට මට ජාවා භාවිතා කළ හැකිය.
ඩග් හෝෆ්

2
ව්‍යතිරේකයක් අල්ලා ගැනීම වඩා මිල අධිකය. මගේ පරීක්ෂණයේදී, නව ගොනුව () තිබේදැයි පරීක්ෂා කිරීම () FileNotFoundException අල්ලා ගැනීමට වඩා 10 ගුණයකින් වේගවත් විය. එබැවින්, සාමාන්‍යයෙන් ගොනු අතුරුදහන් වනු ඇතැයි අපේක්ෂා කරන (තැටි හැඹිලිය වැනි) දර්ශනයක් ඔබට තිබේ නම්, ව්‍යතිරේකය වැරදිය. එසේම, දෙවන අනුමාන කිරීම පද්ධතිය සිසිල් ය.
නික් ෆ්‍රොලොව්

1
N ග්නවර් මා මතු කළ කිසිදු ගැටලුවක් ඔබ විසින් විසඳා නැත. ව්‍යතිරේකය විසි කරනු ලබන්නේ ගොනුව විවෘත කළ නොහැකි විට පමණි; සහ පැයකට වරක් සිදුවන මෙහෙයුම් සඳහා ක්ෂුද්‍ර ප්‍රශස්තිකරණය අවශ්‍ය නොවේ. ඔබේ අවසාන වාක්‍යය විකාරයකි.
මාර්ක්විස් ඔෆ් ලෝර්න්

1
Ough ඩොග්හෝෆ් ඔබේ නඩුවේ කිසිදු ගැටළුවක් නොමැති බැවින් ඔබ පැවැත්ම පරීක්ෂා කිරීමෙන් පසු කිසිවක් කිරීමට උත්සාහ නොකරයි. නමුත් විවෘත කිරීමට පෙර පරීක්ෂා කරන ලෙස OP විශේෂයෙන් ඉල්ලා සිටියේය. මෙම අවස්ථාවේදී ගොනුව විවෘතව අල්ලා ගැනීමට උත්සාහ කිරීම / අල්ලා ගැනීම වඩා හොඳය.
ඩෑන් පැසාරෝ

8

මට නම් ෂෝන් ඒ ඕ හාර්නි විසින් පිළිගත් පිළිතුරේ එකතුවක් සහ එහි ප්‍රති ing ලයක් ලෙස කෝර්ට් 3z අදහස් දැක්වීම හොඳම විසඳුම බව පෙනේ.

පහත දැක්වෙන ස්නිපටය භාවිතා කරන ලදි:

File f = new File(filePathString);
if(f.exists() && f.isFile()) {
    //do something ...
}

මෙය යමෙකුට උපකාර කරනු ඇතැයි සිතමි.


5

මම දන්නවා මම මේ ත්‍රෙඩ් එකේ ටිකක් පරක්කුයි කියලා. කෙසේ වෙතත්, මෙන්න මගේ පිළිතුර, ජාවා 7 සහ ඊට ඉහළ සිට වලංගු වේ.

පහත දැක්වෙන ස්නිපටය

if(Files.isRegularFile(Paths.get(pathToFile))) {
    // do something
}

ගොනුව නොපවතින නම් ක්‍රමය isRegularFileනැවත පැමිණෙන බැවින් එය පරිපූර්ණ තෘප්තිමත් falseවේ. එබැවින්, තිබේදැයි පරීක්ෂා කිරීම අවශ්ය නොවේ Files.exists(...).

වෙනත් පරාමිතීන් සබැඳි හැසිරවිය යුතු ආකාරය දැක්වෙන විකල්පයන් බව සලකන්න. පෙරනිමියෙන්, සංකේතාත්මක සම්බන්ධතා අනුගමනය කරනු ලැබේ.

ජාවා ඔරකල් ප්‍රලේඛනයෙන්


Sonar docs වෙතින්: Files.exists ක්‍රමය JDK 8 හි සැලකිය යුතු ලෙස දුර්වල ක්‍රියාකාරිත්වයක් ඇති අතර ඇත්ත වශයෙන්ම නොපවතින ලිපිගොනු පරීක්ෂා කිරීමට භාවිතා කරන විට යෙදුමක් සැලකිය යුතු ලෙස මන්දගාමී කළ හැකිය. ඒ සඳහා යන Files.notExists, Files.isDirectoryහා Files.isRegularFile. මේ හොඳම විකල්පය වන්නේ:path.toFile().exists()
Genaut

4

එය ද Commons හුරුපුරුදු හොඳින් වටිනවා FileUtils https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html මෙම ගොනු කළමනාකරණය සඳහා අතිරේක ක්රම ඇති අතර බොහෝ විට JDK ට වඩා හොඳයි.


20
ප්‍රශ්නයට පිළිතුරු නොදීමට මාර්ගය. කොමන්ස් හි ප්‍රයෝජනවත් දේවල් රාශියක් ඇති බව මම එකඟ වෙමි, නමුත් සමහර විට අපට එය තවත් එක් පියවරක් ඉදිරියට ගෙන ගොස් OP ඇසූ ප්‍රශ්නයට පිළිතුරක් ලබා දිය හැකිය.
ඩිමොන්ගෝලම්

5
ඔහු මට ප්‍රමාණවත් පිළිතුරක් දුන්නා.
ගොන් කතා

2

හොඳ කේතීකරණ භාවිතයන් සහ සියලු අවස්ථා ආවරණය කරන සරල උදාහරණය:

 private static void fetchIndexSafely(String url) throws FileAlreadyExistsException {
        File f = new File(Constants.RFC_INDEX_LOCAL_NAME);
        if (f.exists()) {
            throw new FileAlreadyExistsException(f.getAbsolutePath());
        } else {
            try {
                URL u = new URL(url);
                FileUtils.copyURLToFile(u, f);
            } catch (MalformedURLException ex) {
                Logger.getLogger(RfcFetcher.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(RfcFetcher.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

යොමු සහ තවත් උදාහරණ

https://zgrepcode.com/examples/java/java/nio/file/filealreadyexistsexception-implementations


1

String සමඟ ගොනු සාදන්නා භාවිතා නොකරන්න.
මෙය ක්‍රියාත්මක නොවනු ඇත!
මෙම භාවිතය වෙනුවට URI:

File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) { 
    // to do
}

වැඩ නොකරන්නේ ඇයි? යූආර්අයි භාවිතා කිරීමෙන් එය නිවැරදි කරන්නේ කෙසේද?
මාර්ක්විස් ඔෆ් ලෝර්න්

අපිට ප්‍රශ්නයක් තිබුණා. f.exists () සත්‍ය වූ අතර අපට ගොනු අන්තර්ගතය පවා ලබා ගත හැකිය. ගැටලුව වූයේ, මාර්ගය වැරදියි, නමුත් ගොනුවේ නම හරි, මෙය තවත් ගොනුවක් විය. යූආර්අයි සමඟ ඉදිකිරීම්කරුගේ ඇමතුම වෙනස් කිරීම, ගැටළුව විසඳා ඇත.
iviorel

0

ඔබට එය මේ ආකාරයෙන් කළ හැකිය

import java.nio.file.Paths;

String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
    //...do somethinh
}

සැලකිල්ලට ගැනීමට ඔබගේ පිළිතුර සමග සසඳන විට හොඳම කාර්යසාධනය File.is Exist()හෝ Files.isRegularFile()JDK 8
ක්රිස්ටියන් Chaparro ඒ

0

මෙම ක්‍රම සැලසුම් කිරීම සඳහා නිශ්චිත අරමුණක් ඇත. ගොනුවක් තිබේද නැද්ද යන්න පරීක්ෂා කිරීමට කිසිවෙකු භාවිතා කරන්නැයි අපට පැවසිය නොහැක.

  1. isFile () : ද යන්න ටෙස්ට් තරග ගොනුව මෙම වියුක්ත pathname මගින් වන සාමාන්ය ගොනුවකි.
  2. පවතී () : මෙම වියුක්ත මාර්ග නාමයෙන් දැක්වෙන ගොනුව හෝ නාමාවලිය තිබේද යන්න පරීක්ෂා කරයි . docs.oracle.com
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.