在我的应用程序允许用户偶尔修改他们的音乐文件我遇到问题,当应用程序没有权限修改文件但用户确信他们已经给予它完全权限
我发现了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())失败原因的任何建议。
答案 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中无法正常工作。