---
title: 'File'
---

This object is created during the analysis phase to represent a file or directory that will be read or written during the execution phase. It is not an open file handle, and cannot be used to directly read or write file contents. Rather, you use it to construct the action graph in a rule implementation function by passing it to action-creating functions. See the [Rules page](https://bazel.build/versions/7.7.1/extending/rules#files) for more information.

When a `File` is passed to an [`Args`](/versions/7.7.1/rules/lib/builtins/Args) object without using a `map_each` function, it is converted to a string by taking the value of its `path` field.

## Members

* [basename](#basename)
* [dirname](#dirname)
* [extension](#extension)
* [is\_directory](#is_directory)
* [is\_source](#is_source)
* [owner](#owner)
* [path](#path)
* [root](#root)
* [short\_path](#short_path)
* [tree\_relative\_path](#tree_relative_path)

## basename

```
string File.basename
```

The base name of this file. This is the name of the file inside the directory.

## dirname

```
string File.dirname
```

The name of the directory containing this file. It's taken from [path](#path) and is always relative to the execution directory.

## extension

```
string File.extension
```

The file extension of this file, following (not including) the rightmost period. Empty string if the file's basename includes no periods.

## is\_directory

```
bool File.is_directory
```

Returns true if this is a directory.

## is\_source

```
bool File.is_source
```

Returns true if this is a source file, i.e. it is not generated.

## owner

```
Label File.owner
```

A label of a target that produces this File.
May return `None`.

## path

```
string File.path
```

The execution path of this file, relative to the workspace's execution directory. It consists of two parts, an optional first part called the *root* (see also the [root](/versions/7.7.1/rules/lib/builtins/root) module), and the second part which is the `short_path`. The root may be empty, which it usually is for non-generated files. For generated files it usually contains a configuration-specific path fragment that encodes things like the target CPU architecture that was used while building said file. Use the `short_path` for the path under which the file is mapped if it's in the runfiles of a binary.

## root

```
root File.root
```

The root beneath which this file resides.

## short\_path

```
string File.short_path
```

The path of this file relative to its root. This excludes the aforementioned *root*, i.e. configuration-specific fragments of the path. This is also the path under which the file is mapped if it's in the runfiles of a binary.

## tree\_relative\_path

```
string File.tree_relative_path
```

The path of this file relative to the root of the ancestor's tree, if the ancestor's [is\_directory](#is_directory) field is true. `tree_relative_path` is only available for expanded files of a directory in an action command, i.e. [Args.add\_all()](/versions/7.7.1/rules/lib/builtins/Args#add_all). For other types of files, it is an error to access this field.