Процесс не может получить доступ к файлу, потому что он используется другим процессом, при переименовании пути к файлу? - PullRequest
0 голосов
/ 06 августа 2020

Я даю тот же путь к файлу для записи данных (отчет о прохождении / неудаче теста) в файл Excel и переименование того же пути к файлу с текущей датой и временем в конце выполнения, но при переименовании того же пути к файлу с помощью текущего Дата и время в конце выполнения. Я получаю одно исключение: java .nio.file.FileSystemException: C: \ Users \ skumari1 \ eclipse-workspace \ CoreLinkAutomation \ PCPAutomation.xlsx -> C : \ Users \ skumari1 \ eclipse-workspace \ CoreLinkAutomation \ PCPAutomation1.xlsx + Validatedate (): процесс не может получить доступ к файлу, потому что он используется другим процессом.

public class TestBase {
        public static WebDriver driver;
        public static Properties prop_config;
        public static Properties prop_filr_io; 
        
        public static String FilePath="C:\\Users\\skumari1\\eclipse-workspace\\CoreLinkAutomation\\PCPAutomation.xlsx"; **Here i am providing the filepath to write data into Excel sheet.**

        public static String sheet_name="PCP(P)";
        public static String sheet_name1="PCP(S)";
        
           
      @BeforeClass
    public static void StartExecution()
    {
        System.out.println("Start Execution");
        
    }
    
        
        
        @BeforeMethod
        public static void initialization() throws IOException
        {
            try {
                prop_config=new Properties();
                prop_config.load(new FileInputStream("C:\\Users\\skumari1\\eclipse-workspace\\CoreLinkAutomation\\src\\main\\java\\com\\corelink\\resources\\config.properties"));
                String browserName=prop_config.getProperty("browser");
    
                if(browserName.equals("chrome"))
                {
                    System.setProperty("webdriver.chrome.driver","H:\\udemy\\chromedriver_win32 (1)\\chromedriver.exe");
                    driver=new ChromeDriver();
                }
                else if(browserName.equals("FF"))
                {
                    System.setProperty("webdriver.gecko.driver","C:\\Users\\skumari1\\eclipse-workspace\\CoreLinkAutomation\\geckodriver.exe");
                    driver=new FirefoxDriver();
                }
                
                driver.manage().window().maximize();
                driver.manage().deleteAllCookies();
                driver.manage().timeouts().pageLoadTimeout(TestUtil.PAGE_LOAD_TIMEOUT, TimeUnit.SECONDS);
                driver.manage().timeouts().implicitlyWait(TestUtil.IMPLICIT_WAIT, TimeUnit.SECONDS);
                driver.get(prop_config.getProperty("url"));
                prop_filr_io=new Properties();
                prop_filr_io.load(new FileInputStream("C:\\Users\\skumari1\\eclipse-workspace\\CoreLinkAutomation\\src\\main\\java\\com\\corelink\\resources\\file_constants.properties"));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            
            
    
            
            
        }
        @AfterMethod
        public void screenShot(ITestResult result) throws Exception{
             //using ITestResult.FAILURE is equals to result.getStatus then it enter into if condition
             if(ITestResult.FAILURE==result.getStatus()){
             try{
             // To create reference of TakesScreenshot
             TakesScreenshot screenshot=(TakesScreenshot)driver;
             // Call method to capture screenshot
             File src=screenshot.getScreenshotAs(OutputType.FILE);
             // Copy files to specific location 
             // result.getName() will return name of test case so that screenshot name will be same as test case name
             //FileUtils.cleanDirectory(new File("./FailedTestCases"+result.getName()+".png"));
             Thread.sleep(5000);
             FileUtils.copyFile(src, new File("./FailedTestCases/" +result.getName()+".png"));
             System.out.println("Successfully captured a screenshot");
    
             }catch (Exception e){
             System.out.println("Exception while taking screenshot "+e.getMessage());
             } 
             }
            
             driver.quit();
             }
        
        @AfterClass
        
            public void EndExecution() throws Exception{
            
            
            
        
            Path source = Paths.get("C:\\Users\\skumari1\\eclipse-workspace\\CoreLinkAutomation\\PCPAutomation.xlsx");**The same Filepath using here**
    
            try{
    
                Files.move(source, source.resolveSibling("PCPAutomation1.xlsx + Validatedate()"),
                          StandardCopyOption.REPLACE_EXISTING);
    
            } catch (Exception e) {
              e.printStackTrace();
            }
            
            }
        public static String Validatedate() {
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy_HH_mm_ss");
            Date date = new Date();
            String date1= dateFormat.format(date);
            // System.out.println("Current date and time is " +date1);
             return date1;
    }
    }


public static void write_test_result(String result, String sheet_name, String filePath,int row_num,int col_num) throws EncryptedDocumentException, FileNotFoundException, IOException
    {
        
        Workbook wb = WorkbookFactory.create(new FileInputStream(filePath));
        Sheet sh = wb.getSheet(sheet_name);
        
        sh.getRow(row_num).createCell(col_num).setCellValue(result);
        //sh.createRow(row_num).createCell(col_num).setCellValue(result);
        wb.write(new FileOutputStream(filePath));
        //wb.close();

    
            }

Здесь создан метод для пути к файлу и имя листа для записи данных в лист Excel и путь к файлу, который я предоставляю в базовом классе перед выполнением, вы можете проверить выше в коде. Следовательно, как мне закрыть эту программу, потому что wb.close не работает.

** Если я использую другой путь к файлу, мой код работает нормально, но требование клиента похоже на Ins ert pass / Fail Test Report в файл Excel, и тот же файл должен быть переименован как обновленная метка времени в конце каждого выполнения, но когда я переименовываю его, я получаю это исключение. Могу ли я получить решение по этому поводу? Можно ли переименовать тот же путь к файлу, который уже используется? **

1 Ответ

0 голосов
/ 07 августа 2020

Вы должны закрывать файлы, которые открываете. Например, new FileOutputStream(..) открывает файл для записи. Файл остается открытым, пока вы его не закроете. То же самое для FileInputStream.

Оператор try-with-resources - удобный способ автоматически закрывать ресурсы, go выходящие за пределы области видимости - например:

try (OutputStream out = new FileOutputStream(filePath)) {
    wb.write(out);
}

Вы также должны вызвать wb.close(), чтобы освободить системные ресурсы, которые он хранит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...