我正在开发一个Windows 8 Metro应用程序,我们打算将它部署到我们公司内的几个平板电脑上。它不适用于Windows应用商店。
我们需要应用程序访问公司网络共享上的某些目录,但强制用户使用FilePicker
并不是我们想要的。
我们的第一次尝试是使用await StorageFolder.GetFolderFromPathAsync("J:\\");
。这不起作用,并产生以下例外:
发生了'System.UnauthorizedAccessException'类型的未处理异常 mscorlib.dll中
WinRT信息:无法访问指定的文件或文件夹(J:\)。 该项目不在应用程序可以访问的位置 (包括应用程序数据文件夹,可通过访问的文件夹) StorageApplicationPermissions中的功能和持久性项 列表)。验证文件未标记为系统或隐藏文件 属性。
其他信息:访问被拒绝。 (HRESULT的例外情况: 0x80070005(E_ACCESSDENIED))
因此,我们尝试将"J:\"
替换为驱动器映射到的网络路径。这也行不通,我们得到了这个例外:
mscorlib.dll中出现未处理的“System.UnauthorizedAccessException”类型异常
WinRT信息:无法访问指定的文件(\\ domain \ path \ JDrive)。验证清单中是否为此类型的文件声明了文件类型关联,并且该文件未标记系统或隐藏文件属性。
其他信息:访问被拒绝。 (HRESULT异常:0x80070005(E_ACCESSDENIED))
我们的应用程序具有以下功能:
我们的应用没有声明
对于Windows应用商店应用来说,这一切都非常合理,但对于一个没有去商店的简单内部应用,是否有任何解决方法?
答案 0 :(得分:2)
以下是JavaScript和VB/C#/C++中的文件访问快速入门。
此外,file access and permissions in Windows Store apps上的这篇文章可能会有用。从这篇文章看,你看起来正在使用正确的功能,但有一个注意事项:
注意:您必须将文件类型关联添加到您的应用清单中 声明您的应用可以在此位置访问的特定文件类型。
这对您看到的错误消息很有意义。你能试试吗?这是一篇关于如何做到这一点的文章:http://msdn.microsoft.com/en-us/library/windows/apps/hh452684.aspx
我还假设您已经检查并确保您要访问的文件未使用系统或隐藏文件属性标记(根据错误消息)。
答案 1 :(得分:1)
我们目前正在通过WCF Web Service
访问文件共享来解决此问题。它远非理想,但它让我们得到了我们所需要的东西。
答案 2 :(得分:1)
以下是管理从运行Windows 8.1 RT的WinRT设备(Microsoft Surface RT)将文件写入网络共享的代码。基本要点是:
这里描述了基本机制: http://msdn.microsoft.com/en-US/library/windows/apps/hh967755.aspx
作为奖励,这显示了如何在WinRT应用程序中捕获输出到标准输出。
代码:
#include "App.xaml.h"
#include "MainPage.xaml.h"
#include <ppltasks.h>
using namespace TestApp;
using namespace Platform;
using namespace Windows::UI::Xaml::Navigation;
using namespace Concurrency;
// Anything that is written to standard output in this function will be saved to a file on a network share
int MAIN(int argc, char** argv)
{
printf("This is log output that is saved to a file on a network share!\n");
return 0;
}
static char buffer[1024*1024];
Windows::Foundation::IAsyncOperation<int>^ MainPage::RunAsync()
{
return create_async([this]()->int {
return MAIN(1, NULL);
});
}
using namespace concurrency;
using namespace Platform;
using namespace Windows::Storage;
using namespace Windows::System;
void MainPage::Run()
{
//capture stdout in buffer
setvbuf(stdout, buffer, _IOFBF, sizeof(buffer));
task<int> testTask(RunAsync());
testTask.then([this](int test_result)
{
size_t origsize = strlen(buffer) + 1;
wchar_t* wcstring = new wchar_t[sizeof(buffer)* sizeof(wchar_t)];
size_t converted_chars = 0;
mbstowcs_s(&converted_chars, wcstring, origsize, buffer, _TRUNCATE);
String^ contents = ref new Platform::String(wcstring);
delete [] wcstring;
Platform::String^ Filename = "log_file.txt";
Platform::String^ FolderName = "\\\\MY-SHARE\\shared-folder";
create_task(Windows::Storage::StorageFolder::GetFolderFromPathAsync(FolderName)).then([this, Filename, contents](StorageFolder^ folder)
{
create_task(folder->CreateFileAsync(Filename, CreationCollisionOption::ReplaceExisting)).then([this, contents](StorageFile^ file)
{
create_task(FileIO::WriteTextAsync(file, contents)).then([this, file, contents](task<void> task)
{
try
{
task.get();
OutputBox->Text = ref new Platform::String(L"File written successfully!");
}
catch (COMException^ ex)
{
OutputBox->Text = ref new Platform::String(L"Error writing file!");
}
});
});
});
});
}
MainPage::MainPage()
{
InitializeComponent();
Run();
}
清单:
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:m2="http://schemas.microsoft.com/appx/2013/manifest">
<Identity Name="6f9dc943-75a5-4195-8a7f-9268fda4e548" Publisher="CN=Someone" Version="1.1.0.1" />
<Properties>
<DisplayName>TestApp</DisplayName>
<PublisherDisplayName>Someone</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
<Description>TestApp</Description>
</Properties>
<Prerequisites>
<OSMinVersion>6.3</OSMinVersion>
<OSMaxVersionTested>6.3</OSMaxVersionTested>
</Prerequisites>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="TestApp.App">
<m2:VisualElements DisplayName="TestApp" Description="TestApp" BackgroundColor="#222222" ForegroundText="light" Square150x150Logo="Assets\Logo.png" Square30x30Logo="Assets\SmallLogo.png">
<m2:DefaultTile>
<m2:ShowNameOnTiles>
<m2:ShowOn Tile="square150x150Logo" />
</m2:ShowNameOnTiles>
</m2:DefaultTile>
<m2:SplashScreen Image="Assets\SplashScreen.png" />
</m2:VisualElements>
<Extensions>
<Extension Category="windows.fileTypeAssociation">
<FileTypeAssociation Name="text">
<DisplayName>Text file</DisplayName>
<SupportedFileTypes>
<FileType ContentType="text/plain">.txt</FileType>
</SupportedFileTypes>
</FileTypeAssociation>
</Extension>
</Extensions>
</Application>
</Applications>
<Capabilities>
<Capability Name="musicLibrary" />
<Capability Name="picturesLibrary" />
<Capability Name="videosLibrary" />
<Capability Name="internetClient" />
<Capability Name="internetClientServer" />
<Capability Name="enterpriseAuthentication" />
<Capability Name="privateNetworkClientServer" />
</Capabilities>
</Package>
答案 3 :(得分:0)
看一下这个问题:Accessing Network shared paths in WinRT
无法访问Win8 App中的共享位置。