你怎么知道为什么FIles.isWritable()在Windows上返回false

时间:2016-01-29 10:30:07

标签: java windows file security

在我的应用程序允许用户偶尔修改他们的音乐文件我遇到问题,当应用程序没有权限修改文件但用户确信他们已经给予它完全权限

我发现了Java 7的改进,并编写了此方法来输出权限

rows=[(1,1),(3,6),(11,2),(7,19),(22,11),(32,11)]

def pearson(v1,v2):

#sums
sum1=sum(v1)
sum2=sum(v2)
print(sum1)
#sums of the sqs
sum1Sq=sum([pow(v,2) for v in v1])
sum2Sq=sum([pow(v,2) for v in v2])

#sum of products
pSum=sum([v1[i]*v2[i] for i in range(len(v1))])

#calculate pearson R
num=pSum-(sum1*sum2/len(v1))
den=sqrt((sum1Sq-pow(sum1,2)/len(v1))*(sum2Sq-pow(sum2,2)/len(v1)))
if den==0: return 0

return 1.0-num/den 



def kmeans(rows,distance=pearson,k=3):
#Determine the min and max values for each point

#COunt through "rows"(data) and find min and max values
ranges=[(min([row[i] for row in rows]),max([row[i] for row in rows]))

for i in range(len(rows[0]))]    
#create k randomly placed centroids within len of 'data'
clusters=[[random.random()*(ranges[i][1]-ranges[i][0])+ranges[i][0]

for i in range(len(rows[0]))] for j in range(k)]
lastmatches=None
for t in range(100):
    print 'Iteration %d' % t

    bestmatches=[[] for i in range(k)]

    #find which centroid is the closest to each row
    for j in range(len(rows)):
        row=rows[j]
        bestmatch=0
        for i in range(k):
            d=distance(clusters[i],row)
            if d<distance(clusters[bestmatch],row): bestmatch=i

        bestmatches[bestmatch].append(j)

    if bestmatches==lastmatches: break
    lastmatches=bestmatches

    #move centroids to the avg of members
    for i in range(k):
        avgs=[0.0]*len(rows[0])
        if len(bestmatches[i])>0:
            #print(len(bestmatches[i]))
            for rowid in bestmatches[i]:
                for m in range(len(rows[rowid])):
                    avgs[m]+=rows[rowid][m]
                for j in range(len(avgs)):
                    avgs[j]/=len(bestmatches[i])
                clusters[i]=avgs

    return bestmatches

但是对于Windows系统来说,仍然很难/不可能找出他们没有权限的原因

select acc.id as YOURALIAS, acc.first_usage_time as YOURALIAS, 
ua.mac as YOURALIAS, ua.inventory_id as YOURALIAS, 
ua.description as YOURALIAS 
from ua INNER JOIN ua_links ON ua.i_ua = ua_links.i_ua 
inner join accounts acc on ua_links.i_account = acc.i_account

,有关如何以编程方式解决isWritable()(或isReadable())失败原因的任何建议。

2 个答案:

答案 0 :(得分:0)

  

有关如何以编程方式解决isWritable()(或isReadable())失败的原因的任何建议

也许这是真正的错误,而不是你的错:

https://bugs.openjdk.java.net/browse/JDK-8034863

http://bugs.java.com/view_bug.do?bug_id=7190897

在谈论Windows权限时,值得一提的是它们确实有点奇怪(甚至微软承认):DENY比ALLOW具有更强的优先级,所以如果你允许一些用户读取特定文件并且还拒绝每个人的每一个权限拒绝'覆盖'所有内容,没有人(包括所有者)无法读取此文件。这就是为什么你不经常在ACL中看到DENY权限的原因。

答案 1 :(得分:0)

我认为混淆来自于有效权限取决于目录权限和文件权限。

如果用户有例如对于文件的Write权限,但对包含目录的Modify权限,他实际上没有写入该文件的权限。查看File and folder permissions的完整标记。

要在Java中进行检查,您可以使用FileSystemProvider.checkAccess方法检查

的权限

假设以下文件和权限(删除范围之外的所有权限以使其更清晰)。使用icacls工具检索权限。

c:\ BUILTIN\Users:(OI)(CI)(RX) - read + execute permission

c:\bar BUILTIN\Users:(RX) - read + execute permission

c:\foo BUILTIN\Users:(F) - full permission

用于演示的示例代码段。

public class AccessCheckDemo {
    public static void main(String[] args) throws IOException {
        String[] files = {"c:/foo", "c:/bar"};
        for (String file : files) {
            Path path = Paths.get(file);
            System.out.println("check " + path);
            System.out.println("file      Files.isWritable: "
                    + Files.isWritable(path));
            System.out.println("directory Files.isWritable: "
                    + Files.isWritable(path.getParent()));
            System.out.println();
        }
    }
}

输出

check c:\foo
file      Files.isWritable: true
directory Files.isWritable: false

check c:\bar
file      Files.isWritable: true
directory Files.isWritable: false

即使BUILTIN\Users文件full permissions上有c:\foo,他们也无法写入此文件,因为目录c:\的权限不允许它(仅读取+执行权限)对于c:\)上的这个群组。

正如badsamaritan(JDK-7190897)已经提到的,这在Java 7中无法正常工作。