У меня проблемы с запуском Time Profiler в Xcode, как для приложений Mac, так и для приложений iPhone.
Шаги, которые у меня есть. пытались открыть Time Profiler, щелкнув раскрывающийся список выбора цели, выбрав мою книгу iPhone или Mac. Выберите цель -> myApp. Если я выбираю приложение для Mac, то нажимаю кнопку записи, в окне появляется большое желтое предупреждение о невозможности настроить триггер выборки для x. Если я выберу приложение для iPod, кнопка записи останется серой и ее нельзя будет нажать.
Любые идеи, что я ' переименовать это напишите в него, потому что в Windows (по крайней мере) кажется, что вы не можете удалить, переименовать или записать в ...
Я пытался использовать FileLock
, чтобы получить монопольный доступ к файлу чтобы:
Потому что в Windows (по крайней мере) кажется, что вы не можете удалить, переименовать или записать в файл, который уже используется. Написанный мною код выглядит примерно так:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public abstract class LockedFileOperation {
public void execute(File file) throws IOException {
if (!file.exists()) {
throw new FileNotFoundException(file.getAbsolutePath());
}
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
try {
// Get an exclusive lock on the whole file
FileLock lock = channel.lock();
try {
doWithLockedFile(file);
} finally {
lock.release();
}
} finally {
channel.close();
}
}
public abstract void doWithLockedFile(File file) throws IOException;
}
Вот несколько модульных тестов, демонстрирующих проблему. Для запуска третьего теста вам потребуется Apache commons-io в пути к классам.
import java.io.File;
import java.io.IOException;
import junit.framework.TestCase;
public class LockedFileOperationTest extends TestCase {
private File testFile;
@Override
protected void setUp() throws Exception {
String tmpDir = System.getProperty("java.io.tmpdir");
testFile = new File(tmpDir, "test.tmp");
if (!testFile.exists() && !testFile.createNewFile()) {
throw new IOException("Failed to create test file: " + testFile);
}
}
public void testRename() throws IOException {
new LockedFileOperation() {
@Override
public void doWithLockedFile(File file) throws IOException {
if (!file.renameTo(new File("C:/Temp/foo"))) {
fail();
}
}
}.execute(testFile);
}
public void testDelete() throws IOException {
new LockedFileOperation() {
@Override
public void doWithLockedFile(File file) throws IOException {
if (!file.delete()) {
fail();
}
}
}.execute(testFile);
}
public void testWrite() throws IOException {
new LockedFileOperation() {
@Override
public void doWithLockedFile(File file) throws IOException {
org.apache.commons.io.FileUtils.writeStringToFile(file, "file content");
}
}.execute(testFile);
}
}
Ни один из тестов не прошел. Первые 2 терпят неудачу, а последний вызывает это исключение:
java.io.IOException: The process cannot access the file because another process has locked a portion of the file
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:247)
at org.apache.commons.io.IOUtils.write(IOUtils.java:784)
at org.apache.commons.io.IOUtils.write(IOUtils.java:808)
at org.apache.commons.io.FileUtils.writeStringToFile(FileUtils.java:1251)
at org.apache.commons.io.FileUtils.writeStringToFile(FileUtils.java:1265)
Похоже, что метод lock ()
устанавливает блокировку файла, которая затем не позволяет мне переименовать / удалить / записать его. Я предполагал, что блокировка файла предоставит мне эксклюзивный доступ к файлу, поэтому я мог затем переименовать / удалить / записать его, не беспокоясь о том, обращается ли к нему какой-либо другой процесс.
Либо я неправильно понимаю FileLock
или это не подходящее решение моей проблемы.