在Windows 7中,mkdirs无法正常工作。

3

我制作了一个小型的Java应用程序,可以将CD上的目录复制到硬盘上。我在Windows Vista上使用该程序成功运行,但在Windows 7上运行时失败。

主要问题是需要创建Program Files文件夹内的一个文件夹。

我使用了DestinationFolder.mkdirs()方法,但它无法创建文件夹。

以下是Java代码:

public void Install_App()
{
    File srcFolder = new File(System.getProperty("user.dir") + "\\WINDOWS");
    File destFolder = new File("C:\\Program Files\\test1\\test2\\");
    if (srcFolder.exists())
    {
        try{
            if(!destFolder.exists())
        {
            destFolder.mkdirs();
        }
            copyFolder(srcFolder,destFolder,1);
        }catch(IOException e){
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, e.toString());
            error=true;
            System.exit(0);
            }
    } else 
    {
        JOptionPane.showMessageDialog(null, "Error. Source Directory doesn't exist.");
        error=true;
    };
} 

...然后有一个复制文件夹的功能,使用输入流和输出流来复制文件。

问题在于文件夹从未被创建。我的登录用户是管理员。就像我说的,在Vista中它可以工作。

请问你能帮我吗?谢谢。

问题是我用Java创建了这个应用程序,以在Windows和Mac上运行。 在Windows中,它应该通过autorun.inf自动运行,如下所示:

[autorun]
OPEN=java_app.bat

那么这个批处理文件将运行以下内容:
@echo off
start javaw -jar "java_app.jar"
EXIT

那么我该如何修改它以自动以管理员身份运行呢? 这个Java应用程序的主要思想是简化安装和使用外部应用程序的过程,无论你使用哪种操作系统。如果我必须要求用户以管理员身份运行它,那么它就失去了简单易用的意义。


2
UAC说不行!请参见http://stackoverflow.com/questions/2709531/windows-7-create-folder-in-program-files-failing-in-c-sharp-code-even-thought - Alex K.
3个回答

1

我猜想您是以普通用户身份运行您的代码。

在Windows 7下,以普通用户身份写入Program Files目录默认会被UAC阻挡。这就是为什么您的Java代码无法创建目录的原因。

尝试从提权shell中运行您的Java代码。您可以通过开始 > [输入cmd] > [右键点击'cmd.exe'并选择“以管理员身份运行”]来获得一个提权的shell。现在,在管理员命令提示符中使用java -jar或者java -classpath运行您的编译代码。现在应该可以工作了。

自动化UAC提示:

您需要创建一个清单文件,详细说明请参见[1]和[2],让Windows/UAC知道您的程序需要提升的特权。

还要检查这个[3]实用程序,名为elevate,它将作为子进程生成您的程序,同时处理所有来自父(elevate)程序本身的UAC权限请求。

[1] [http://msdn.microsoft.com/en-us/library/aa511445.aspx][2] 
[2] [http://msdn.microsoft.com/en-us/library/bb756929.aspx][3]
[3] [http://www.wintellect.com/cs/blogs/jrobbins/archive/2007/03/27/elevate-a-process-at-the-command-line-in-vista.aspx][4]

问题是我用Java创建了这个应用程序,以在Windows和Mac上运行。在Windows中,它应该像这样使用autorun.inf自动运行: - user897013
谢谢你的回答。我在原来的问题上添加了一些注释,只是为了尝试解释为什么我需要这个。 - user897013
@user897013:你需要创建一个清单文件,如[1]和[2]中所述,让Windows/UAC知道你的程序需要提升的权限。[1] http://msdn.microsoft.com/en-us/library/aa511445.aspx [2] http://msdn.microsoft.com/en-us/library/bb756929.aspx - gsbabil
@user897013:还要检查一下这个名为elevate的[1]实用程序,它会将您的程序作为子进程生成,同时处理来自父(elevate)程序本身的UAC权限请求。[1] http://www.wintellect.com/cs/blogs/jrobbins/archive/2007/03/27/elevate-a-process-at-the-command-line-in-vista.aspx - gsbabil
谢谢你的帮助,但你确定这段代码可以在Java中使用吗?<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <v3:trustInfo xmlns:v3="urn:schemas-microsoft-com:asm.v3"> v3:security v3:requestedPrivileges <v3:requestedExecutionLevel level="highestAvailable"/> </v3:requestedPrivileges> </v3:security> </v3:trustInfo> </assembly>看起来更像是VB的代码。 - user897013

0

这是所有的权限问题。我在我的机器上也遇到了同样的问题。你的Java代码没有问题。我尝试使用命令行创建文件夹,但是得到了“拒绝访问”的错误。

C:\Users\alexr>mkdir "C:\Program Files\mytest"
Access is denied.

所以,解决方案是在其他位置创建文件夹或以管理员身份运行。正如@Alex K.已经说过的那样,请参考此帖子了解如何获得这些权限。

Windows 7 Create Folder in "Program Files" failing in C# code even thought I have admin rights!


0

您没有在Program Files中创建目录的适当权限。您必须以管理员权限启动应用程序。

一个重要的事情需要学习,就是在开发应用程序时,永远不要编写它们来保存/修改Program Files内部的数据;相反,它们应该写入AppDataMy Documents

自Windows Vista以来,修改Program Files中的文件已经被严重弃用,甚至早于此。您应该尝试从一开始遵循这个规则,否则如果您想要在线发布应用程序,就意味着需要重新编写整个应用程序,这将带来很多麻烦。


@Stamted 感谢您的回答,但是该应用程序必须安装在 Program Files 文件夹内已知的文件夹中。 - user897013

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接