none
打开文件不存在时为什么会崩溃 RRS feed

  • 问题

  •      create_task(KnownFolders::DocumentsLibrary->GetFileAsync("1.dat")).then([](StorageFile^ file)
        {
            // Read the file text.
         //  return FileIO::ReadTextAsync(file, UnicodeEncoding::Utf8);

        });

    像上面这样写,或者

     create_task(KnownFolders::DocumentsLibrary->GetFileAsync(path)).then([this](task<StorageFile^> getFileTask)
        {
                //configfile = getFileTask.get();

        });

    下面这样写,如果1.dat文件不存在

    都会报错:处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数。

    请问,如何处理

    2012年9月4日 9:59

答案

  • ???

    2012年9月5日 19:03
  • 方法,设计成异步的:

    IAsyncOperation<bool>^ CheckFileExisted(StorageFolder^ folder, String^ fileName)
    {
    	return create_async([=](){
    		bool isExisted = false;
    
    		QueryOptions^ queryOptions = ref new QueryOptions();
    		queryOptions->FolderDepth = FolderDepth::Shallow;
    
    		StorageFileQueryResult^ queryResult = folder->
    			CreateFileQueryWithOptions(queryOptions);
    
    		return create_task(queryResult->GetFilesAsync()).then([fileName, &isExisted](IVectorView<StorageFile^>^ files){
    			for each (StorageFile^ file in files)
    			{
    				if (file->Name == fileName) 
    				{
    					isExisted = true;
    					break;
    				}
    			}
    			return isExisted;
    		});
    	});
    }
    

    使用:

    	bool b;
    	create_task(CheckFileExisted(KnownFolders::DocumentsLibrary, "text.txt")).then([=, &b](bool result){
    		b = result;
    	});


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月5日 8:04
    版主

全部回复

  • 第一个问题是,ReadTextAsync 也是异步的。

    第二个问题是,GetFileAsync的返回是 IAsyncOperation<Windows::Storage::StorageFile^>^  所以,lambda 表达式应该写

    )).then([this](StorageFile^ file) 和第一个一样。

    完整的修改:

    	create_task(KnownFolders::DocumentsLibrary->GetFileAsync("SinaLog.txt")).then([this](StorageFile^ file)
    	{
    		create_task(FileIO::ReadTextAsync(file, UnicodeEncoding::Utf8)).then([this](String^ text){
    			configfile  = text;
    		});
    	});


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月5日 5:51
    版主
  • 我现在就是想打开一个文件。文件不存在,就会报错

    你的这个代码,在文件不存在的情况下,仍然会报错啊


    而且configfile  = text;这一句,根本编不过,configfile是storage^,text是string^
    • 已编辑 抱抱 2012年9月5日 6:43
    2012年9月5日 6:42
  • 原来你是文件不存在啊, 文件不存在这里是抛异常,所以造成崩溃。

    我们没有检查文件存在不存在的方法 ,不过我倒实现过一个,你可以看看是否有用 C# 版本:

            public async static Task<bool> CheckFileExisted(StorageFolder folder, string fileName)
            {
                StorageFileQueryResult queryResult = folder.
                        CreateFileQueryWithOptions(
                            new QueryOptions()
                            {
                                FolderDepth = FolderDepth.Shallow
                            });
                foreach (StorageFile file in await queryResult.GetFilesAsync())
                {
                    if (file.Name == fileName) return true;
                }
                return false;
            }

    转成C++即可工作


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月5日 7:13
    版主
  • 我要是有C#就不问了,C#直接用不报错

    这个能麻烦给个C++的代码吗

    还有点疑问,难道这个API设计的时候,就没考虑过文件不存在的情况?为什么文件不存在就崩溃?起码应该给一个异常捕获把
    • 已编辑 抱抱 2012年9月5日 7:31
    2012年9月5日 7:29
  • C#很多情况也报错,而且是直接抛异常,不会返回null值,你先获取那个目录(目录也需要一层层去找)中的所有文件,然后去搜索看文件是否存在,然后再去打开
    2012年9月5日 7:37
  • 我不懂C#,请给我C++
    2012年9月5日 7:43
  • 方法,设计成异步的:

    IAsyncOperation<bool>^ CheckFileExisted(StorageFolder^ folder, String^ fileName)
    {
    	return create_async([=](){
    		bool isExisted = false;
    
    		QueryOptions^ queryOptions = ref new QueryOptions();
    		queryOptions->FolderDepth = FolderDepth::Shallow;
    
    		StorageFileQueryResult^ queryResult = folder->
    			CreateFileQueryWithOptions(queryOptions);
    
    		return create_task(queryResult->GetFilesAsync()).then([fileName, &isExisted](IVectorView<StorageFile^>^ files){
    			for each (StorageFile^ file in files)
    			{
    				if (file->Name == fileName) 
    				{
    					isExisted = true;
    					break;
    				}
    			}
    			return isExisted;
    		});
    	});
    }
    

    使用:

    	bool b;
    	create_task(CheckFileExisted(KnownFolders::DocumentsLibrary, "text.txt")).then([=, &b](bool result){
    		b = result;
    	});


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月5日 8:04
    版主
  • 这个API如果文件不存在,就会抛出异常,需要你自己捕获异常,异常直接抛到上层就会引起App crash。

    Thanks! Damon.Tian

    2012年9月5日 8:07
  • 谢谢,我也搞定了

    你的代码比我的好看,我就不拿出来现了


    • 已编辑 抱抱 2012年9月5日 8:21
    2012年9月5日 8:20
  • ???

    2012年9月5日 19:03