簡體   English   中英

什么是對我的文件的引用,使我無法成功調用.delete()?

[英]What is referring to my file, preventing me from calling .delete() successfully?

我正在制作游戲,並且已經開始使用名為SaveManager的類進行工作,到目前為止,除了刪除游戲之外,我沒有任何問題。

我的問題是,.delete()在大多數情況下返回false而不調用異常。

如果我做一個循環(如下),盡管我實際上並未更改任何變量或引用,但它最終還是會刪除,而且游戲循環本身絕對不會處理文件,因此不會“釋放”文件本身。任何一點。

public void delete(File save)
    {
        while (save.exists() && !save.delete())
            {
                i++;
            }
        new infoBox("Times delete called: " + i, "delete method in saveManager");

所以我的問題是:如果引用不是來自我的一個類,我如何找到它並刪除它,從而允許我刪除上面的循環,這基本上會劫持游戲,直到文件消失。

這是處理文件的代碼,以防萬一我確實做錯了(上帝禁止!)。我敢肯定這確實會“釋放”有問題的保存文件...

private void save()
{
    ObjectOutputStream OOS = null;
    BufferedOutputStream BOS = null;
    FileOutputStream FOS = null;
    try
        {
            File saveFile = new File(saveDirectory + hub.world.saveName + ".dat");
            OOS = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(saveFile, false)));

            OOS.write... (List of Objects & Strings here)
            OOS.flush();
            OOS.close(); 

            game.saved = true; //Used for warning message on exit
            this.setSavesList();
        }
    catch (Exception e)
        {
                new errorWindow(e, "SaveFile, I/O error");
        }
    finally
        {
            try
                {
                    FOS.flush();
                    FOS.close();
                    BOS.flush();
                    BOS.close();
                    OOS.flush();
                    OOS.close();
                }
            catch (IOException e)
                {
                    hub.frame.errorWindow(e, "Problem closing streams");
                }
        }

}

處理文件時要檢查的一件事是,是否在嘗試刪除所有打開的流之前將其關閉。

除非關閉打開的流,否則無法刪除文件。

看看這個

您正在創建三個流,並且僅關閉最上面的一個(OOS)。

您應該手動關閉每個流。 我認為這將解決您的問題。

另外,將close()放在finally塊中通常被認為是一種好習慣,因此肯定會發生。

FileOutputStream fos = new FileOutputStream(fileName);
try 
{
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        OOS = new ObjectOutputStream(bos);

        OOS.write... (List of Objects & Strings here)
        OOS.flush();
        OOS.close(); 

        bos.flush();
        bos.close();

        game.saved = true; //Used for warning message on exit
        this.setSavesList();
} catch (IOException ioe)
{
}
finally
{
  fos.close();
}

否則,您可能會刷新對象輸出流,並且數據只會卡在緩沖的輸出流中,而永遠不會寫入文件輸出流。

這是值得思考的...從上面的代碼中,您使用了try-catch塊...我的猜測是上述操作之一引發了異常,因此out.close()操作被跳過了...為什么不添加“ finally”塊並在那里關閉流...肯定會幫助您節省麻煩。

您確定文件實際上是在創建的嗎? 在上面的代碼段中,您擁有while(!save.delete()),但稍后您似乎將其稱為saveFile,這可能是兩個不同的文件! 我先通過執行以下操作來檢查文件是否甚至存在於磁盤上

if(!saveFile.exists()) {
do something here
}

如果不存在,則刪除將僅返回false,您將無法刪除不存在的文件。

如果要檢查刪除結果,則還需要檢查文件是否存在。 顯然,如果沒有文件或文件已被刪除,則delete()將返回false。 ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM